2012-07-24 91 views
0

这是我的代码的基本思想。我删除了很多额外的东西从我的实际代码,但它主要是CSS - 都不应该对此有什么影响?Firebase child_removed未被调用

listRef.on('child_removed', function(childSnapshot, prevChildName) { 
    alert('child removed!'); 
}); 

listRef.on('child_added', function(childSnapshot, prevChildName) { 
    itemRef = childSnapshot.ref(); 

    alert('child added!); 

    itemRef.on('value', function(snapshot){ 
     alert('item value changed!'); 

     var name = snapshot.val().name; // if I remove this line, child_removed is called 
     $("#name").html(name); 
    }); 
}); 

$("#button").click(function() { 
    itemRef.remove(); 
}); 

的问题是,在$("#button")点击,的itemref从listRef删除在火力地堡,但'child_removed'事件永远不会触发...如果我拿出

driveRef = undefined; 

然后child_removed叫...

其他的一切工作 - $("#name")被更新,所有的的我用来测试它的210个对话框工作正常 - 唯一的问题是child_removed未被调用。

+1

'driveRef = undefined'没有出现在您的示例代码中;我认为这是一个错误的复制/粘贴。但是,您评论的行使用snapshot.val()。name,但snapshot.val()可能为null! – Kato 2012-07-24 15:06:36

+0

感谢加藤,我没有意识到itemRef.on()将在物品被移除时被调用...... – 2012-07-24 16:56:14

+0

对,如果您没有从Lehenbauer先生的回答中推论出来,我的解释是,当“开启('value',...)'被调用时,如果记录不存在,它将被视为查找并用'null'调用(文档中的更多内容);从这一点来看,它的表现就好像它听起来似的 – Kato 2012-07-24 19:48:30

回答

1

我认为加藤的评论是正确的。如果你看看你的浏览器开发工具的JavaScript控制台,或者更好地设置它打破所有的例外(例如directions for Chrome),我敢打赌,你会发现你的'价值'回调被调用snapshot.val()== null孩子被移除,因此你的代码会抛出一个异常,阻止Firebase提出进一步的事件(即你的child_removed事件)。

我们有一些功能计划让Firebase更容忍引发异常的事件回调,但目前的解决方案是在'value'回调中检查snapshot.val()== null。