Realtime databaseからのデータ取得について、child_addedイベントの呼び出しタイミングがいまいち理解できません。
サンプルで下記のような①社員名と②所属部署を入力するだけの簡単なアプリを作りました。
HTML
1 <h1>SampleProject for Firebase</h1> 2 3 <div> 4 <form> 5 <div class="form-group"> 6 <label for="name">氏名:</label> 7 <input type="text" class="form-control" id="name" placeholder="Name"> 8 </div> 9 <div class="form-group"> 10 <label for="group">所属:</label> 11 <input type="text" class="form-control" id="group" placeholder="Group"> 12 </div> 13 <button type="submit" class="btn btn-primary btn-block register">登録</button> 14 </form> 15 </div> 16 17 <div> 18 <ul class="list"> 19 <li class="list_item"></li> 20 </ul> 21 </div>
JavaScript
1// 1. データの登録 2const registerData = (name, group) => { 3 const userInfo = { 4 name, 5 group, 6 createdAt: firebase.database.ServerValue.TIMESTAMP, 7 } 8 firebase.database().ref('users').push(userInfo); 9 console.log('データの登録処理が行われました'); 10}; 11 12// 2. データが追加された際のリスナー (リスナーを登録する関数) 13const getData = () => { 14 $('.list_item').empty(); 15 const userData = firebase.database().ref('users').orderByChild('createdAt'); 16 userData.off('child_added'); 17 userData.on('child_added', (userSnapshot) => { 18 const userId = userSnapshot.key; 19 const snapData = userSnapshot.val(); 20 addUser(userId, snapData); 21 }); 22}; 23 24// HTML要素の挿入 25const createUserListItem = (userId, snapData) => { 26 const $list_item = $('.list_item').clone(); 27 $list_item.text(snapData.name); 28 $list_item.attr('id', `user-id-${userId}`); 29 return $list_item; 30} 31const addUser = (userId, snapData) => { 32 const $list_item = createUserListItem(userId, snapData); 33 $list_item.appendTo('.list'); 34}; 35 36 37getData(); 38 39// データ登録処理の呼び出し 40$('.register').on('click', (e) => { 41 e.preventDefault(); 42 43 const name = $('#name').val(); 44 const group = $('#group').val(); 45 46 registerData(name, group); 47 48 $('#name').val(''); 49 $('#group').val(''); 50});
単純に、社員を登録していけば1件ずつ<li>タグに囲まれた社員名を画面上に表示させていきたいのですが、例えば3件データを入力すると、2件目以降のデータが何回も<li>タグで表示されてしまいます。。。(下記に実行結果の画像リンクを貼り付けます)
とうぜんfirebaseの公式docもみたのですが、いまいち腹落ちせず、どなたか答えをお教えいただければ幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 13:00