Firebase数组项目已删除并立即自动添加回来(使用AngularFire)

时间:2016-04-16 01:23:12

标签: javascript angularjs firebase angularfire

我正在尝试从$ firebaseArray(框)中删除一个项目。

删除功能:

function remove(boxJson) {
        return boxes.$remove(boxJson);
    }

它有效,但会立即加回:

enter image description here

这是带来数组的方法:

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();
    }

4 个答案:

答案 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解决了该问题。