我非常熟悉的“child_added”,“child_changed”,“child_removed”和“价值”的理念。 每当我使用一个列表,这应该是动态更新自己,我应该使用除“值”之外的所有函数,并且每当我只需要数据的静态快照时,我将使用“值”。如何有效地使用child_added
我的问题如下:
难道真的写三个触发器(4如果算上“child_moved”),每当我有一个列表的最好方法?一个简单的应用程序有很多列表。 如果是的话,它是如何以最有效的方式在JavaScript中完成的?我目前的做法如下:
- on child_added:遍历整个列表;看看密钥与我刚从事件收到的密钥相等的位置,并将其值保存为oldValue;现在发现prevChildKey指数和prevChildKey的索引后插入刚接到孩子,而除去myList中[myList.indexOf(属性oldValue)]从列表中
- 上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