我正在尝试从$ firebaseArray(框)中删除一个项目。
删除功能:
function remove(boxJson) {
return boxes.$remove(boxJson);
}
它有效,但会立即加回:
这是带来数组的方法:
function getBoxes(screenIndex) {
var boxesRef = screens
.child("s-" + screenIndex)
.child("boxes");
return $firebaseArray(boxesRef);
}
我想也许我对firebaseArray持有多个引用,当一个删除时,另一个添加,但后来我认为firebase应该处理它,不是吗?
无论如何,我对此感到迷茫,任何想法?
更新
当我破解并删除两次(超时)时,它似乎有效:
function removeForce(screenIndex, boxId) {
setTimeout(function () {
API.removeBox(screenIndex, boxId);
}, 1000);
return API.removeBox(screenIndex, boxId);
}
和API.removeBox:
function removeBox(screenIndex, boxId) {
var boxRef = screens
.child("s-" + screenIndex)
.child("boxes")
.child(boxId);
return boxRef.remove();
}
答案 0 :(得分:1)
当您从firebase中删除某些内容时,它是异步的。根据文档,删除项目的正确方法来自firebase,使用AngularFire是:
var obj = $firebaseObject(ref);
obj.$remove().then(function(ref) {
// data has been deleted locally and in the database
}, function(error) {
console.log("Error:", error);
});
$ remove()...从本地和数据库中删除整个对象。此方法返回将从服务器中删除数据时将履行的承诺。该承诺将通过Firebase参考解决,以消除记录。
链接到文档:https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebaseobject-remove
答案 1 :(得分:1)
最可能的原因是您有不允许删除的安全规则。
当您致电boxes.$remove
时,Firebase会立即在本地触发child_removed
事件,以确保快速更新用户界面。然后,它将命令发送到Firebase服务器以检查它并更新数据库。
在服务器上有一个禁止删除的安全规则。服务器发送"它失败"回复客户端,然后提出child_added
事件来修复UI。
答案 2 :(得分:1)
显然我删除后再次保存这些项目。显然我的错误是:
function removeSelected(boxes) {
var selectedBoxes = Selector.getSelectedBoxes(boxes);
angular.forEach(selectedBoxes, function (box) {
BoxManager.remove(box);
});
Selector.clearSelection(boxes, true);
}
在clearSelection方法中,我正在更新框中的字段并再次保存。
除了明显的错误,这对我来说是如何使用Firebase的一个教训。如果系统的某些部分保留了已删除项目的副本,则保存它不会产生错误,但会恢复已删除的项目。
答案 3 :(得分:0)
对于那些有类似问题,但尚未解决的人。
有两种监听事件的方法:.on()
和.once()
。就我而言,这就是问题的原因。
我正在制定一个迁移程序,该程序应该运行一次
writeRef
.orderByChild('text_hash')
.equalTo(addItem.text_hash)
.on('value', val => { // <--
if (!val.exists()) {
writeRef.push(addItem)
}
});
因此,问题完全是由于.on
方法造成的。从FB的控制台进行数据操作后,它将每次触发。
更改为.once
解决了该问题。