「child_added」、「child_changed」、「child_removed」、および「value」という概念に精通しています。 リストを使うと、動的に更新されるはずですが、「値」を除くすべての関数を使用し、データの静的なスナップショットが必要なときは常に「値」を使用します。child_addedを効率的に使用する方法
次のように私の質問は:
は、それは本当に(あなたが「child_moved」数える場合4)私はリストを持っているときは常に3つのトリガを書くための最良の方法ですか?単純なアプリにはたくさんのリストがあります。 はいの場合、javascriptで最も効率的な方法でどのように処理されますか?私の現在のアプローチは以下の通りです:
- on child_added:私のリスト全体を繰り返します。キーがイベントから受け取ったキーと等しいかどうかを調べ、oldValueの値を保存します。リストからmyList [myList.indexOf(oldValue)]を削除しながら、prevChildKeyのインデックスを見つけて、直前に受信した子をprevChildKeyのインデックスの後に挿入します。
- on child_changed:リスト全体を繰り返します。キーがイベントから受け取ったキーと等しいかどうかを調べ、oldValueの値を保存します。セットmyList [myList.indexOf(oldValue)] = newValue;
- on child_removed:myList.splice(...)と同じだけです。
- on child_moved:私はこれを実装していません。しかし、私はおそらくそれが必要になります、child_changedが呼び出され、これは私の要素の変更の順序になりました。ですから、child_addedに非常に類似したロジックがあります
これをより洗練された方法で処理する方法はありますか?私は最初にmyList [child.key]で要素にアクセスしようとしましたが、これは私のためには機能しません。
編集:追加コード自分のアプリケーション内のすべてのリストについては、
myRef.orderByChild("timestamp").on("child_added",(message,prevChildKey) => {
//Transform the firebase-date into my own format
var template = {
senderName: message.val().sender,
time: message.val().timestamp,
id: message.key}
//Check where to add this
if(prevChildKey){
this.messages.forEach(currentMessage => {
if(currentMessage.id === prevChildKey){
var indexToAdd = this.messages.indexOf(currentMessage);
this.messages.splice(indexToAdd+1,0,template];
}
});
}else
this.messages.unshift(template);
});
myRef.on("child_changed", message => { //orderByChild makes no sense here, right ?
//Transform the firebase-date into my own format
var template = {
senderName: message.val().sender,
time: message.val().timestamp,
id: message.key}
var toBeUpdated = undefined;
this.messages.forEach(currentMessage => {
if(currentMessage.id === message.id){
this.messages[this.messages.indexOf(currentMessage)] = template;
}
})
//How do I preserve ordering here, since I was ordering by timestamp on child_added before and I don't check if that value changed
}
myRef.on("child_removed", oldMessage => {
//Remove the message
this.messages.forEach(currentMessage => {
if(currentMessage.id === oldMessage.id){
this.messages.splice(this.messages.indexOf(currentMessage),1);
}
})
}
myRef.orderByChild("timestamp").on("child_moved", (message,prevChildKey) => { //Not too sure, how this works. Do I need the orderByChild here to preserve it ?
var messageToMove = undefined;
var messagePosition = undefined;
var indexToMoveTo = undefined;
this.messages.forEach(currentMessage => {
if(currentMessage.id === message.id){
messagePosition = this.messages.indexOf(currentMessage);
messageToMove = this.messages[messagePosition];
}
if(currentMessage.id === prevChildKey){
indexToMoveTo = this.messages.indexOf(currentMessage) + 1;
}
})
//Remove the message from where it was
this.messaged.splice(messagePosition,1);
//Add the message at the new position
this.messages.splice(indexToMoveTo,0,messageToMove);
}
もっと効率的なやり方があるかどうかを尋ねてきます。私たちの多くは、コードの説明を解析するのが得意ではありません。だから、[あなたの現在のソリューションを示す最小限の実際のコード](http://stackoverflow.com/help/mcve)を投稿してください。おそらくもっと助けることができます。 –
デモンストレーションとしていくつかのコードを追加しました – Thomas
ユースケースの説明は少し不明です。 *なぜ*キーがあなたが今受け取ったキーと同じかどうかを確認するためにリストを反復していますか?あなたは投稿を注文し続けようとしていますか?もしそうならば、各投稿にタイムスタンプを付けるだけで、いつも正しい順序で表示されます。また、投稿が追加、変更、削除された場合、特定の投稿がアプリに渡され、そのノードに直接アクセスできるようになります。リストを繰り返して検索する必要はありません。つまり、node_3が変更された場合、そのキー(node_3)がアプリに渡され、node_3/child_nodesに直接アクセスして更新できます。 – Jay