Firebase推送不添加但替换(JavaScript)

时间:2015-03-31 20:26:47

标签: javascript firebase

我有以下代码向某人添加备注(' opm')(' leerling')。

function onFormSubmitted()
{
    event.preventDefault();

    var ref = new Firebase("https://mydatabase.firebaseio.com/");
    var _leerling = document.getElementById("Leerling").value;
    var _opmerking = document.getElementById("Opmerking").value;

    var postsRef = ref.child("opmerkingen");
    var newPostRef = postsRef.push({
        leerling: _leerling,
        opmerking: _opmerking
    });

    var postID = newPostRef.key();
    var leerlingRef = ref.child("leerling").child(_leerling);

    leerlingRef.once('value', function(snapshot) {

        if( snapshot.val() === null ) {
            /* does not exist */

            var leerlingNummer = _leerling.substring(0,6).trim();
            ref.child("leerling").child(leerlingNummer).set({
                    "naam": _leerling.substring(7,33).trim(),
                    "klas": _leerling.substring(34,38)
            })
            ref.child("leerling").child(leerlingNummer).child("opmerkingen").push({
                "opmID": postID
            })

        } else {
            var leerlingPostRef = snapshot.ref().child("opmerkingen)");
            leerlingPostRef.push({"opmID": postID});
        }
    });
}

在代码的开头postsRef.push按照预期向opmerkingen子(在根中)添加注释。

在代码的最后,我知道(leerlingPostRef.push)对于leerling的opmerkingen子进程,但整个opmerkingen子进行REPLACED,删除现有的opm:postID而不是添加一。

有什么问题以及如何解决?

2 个答案:

答案 0 :(得分:1)

当我从常规输入类型中传递leerling =' text'它工作得很好,但是当我从select-option输入字段传递它时,它失败了,如上所述。

解决方案:

var leerlingRef = ref.child("leerling").child(_leerling.substring(0,6).trim()); 

而不是

var leerlingRef = ref.child("leerling").child(_leerling); 

第15行

答案 1 :(得分:0)

我建议使用Firebase.update(),因为它会创建或更新值。使用Firebase.push()删除任何内容,并删除某个子树中的所有数据,并替换为您发送的内容。

因此,只需将Firebase.push()的任何引用替换为Firebase.update(),您的代码应按预期工作。

参考链接:Firebase.update()

注意:这将替换您要更新的数据的任何引用。因此,如果您在Firebase中拥有值"opmID": 1,则将"opmID"更新为2将替换原始"opmID": 1。由于Firebase的行为类似于字典,因此密钥只能存在一次。