收集初始数据并对后续的child_added采取行动

时间:2014-03-02 04:53:13

标签: javascript knockout.js firebase

我正在使用Firebase将数组存储为集合的一部分。当用户访问我的网页时,我想显示整个数组的内容。我可以通过value事件检索此内容。页面上的用户还可以向阵列添加元素。这也应该更新视图。

我正在使用Knockout.js来维护更新显示的可观察数组。

var Model = function (id) {
    var self = this;
    self.times = ko.observableArray();

    self.ref = firebase.child("users/" + id);

    self.ref.on("value", function (snapshot) {

        /* Logic to add each item to `times` goes here
         *
         * there is some logic that only needs to be performed
         * initially on the existing set of elements in the DB
         * such as sorting.  Ideally, this would not be done
         * for the `child_added` callback
         */

        self.ref.off("value");
        self.ref.on("child_added", self.addChild);
    });

    self.addChild = function (snapshot) {
        self.times.push(snapshot.val());
    }
};

然而,这并不像我预期的那样有效,因为即使在addChild被触发后,似乎第二个child_added也会从value调用。也就是说,即使child_added已经有valuevalue也会检索所有值。

作为替代方案,我可以在重新创建数组之前仅使用 .removeAll和{{1}},但这似乎非常浪费。

1 个答案:

答案 0 :(得分:1)

此代码在一个实例中使用this而不是self,这会导致意外错误。

关于数组:使用数组存储数据并不安全。当多个用户尝试推送到同一个密钥时,将覆盖一个密钥。相反,请使用对象并使用Firebase的push命令。

关于child_added的正确用法:child_added的文档指出现有记录与新记录之间没有区别:

  

已添加儿童:此活动将针对每个初始儿童触发一次   在这个位置,它会在每次新的时候再次触发   孩子被添加。传递给回调的DataSnapshot将反映出来   相关孩子的数据。出于订购目的,它通过了   第二个参数,它是一个包含前一个名称的字符串   按优先顺序排列的兄弟姐妹(如果是第一个孩子,则为空。)

这里的重点是降低代码复杂性。我们正在以实时范式开展工作;数据不断变化。初始数据与新数据和发布数据等之间不需要if / then / else;它对于实时操作甚至没有多大意义。

最后,回答你的问题。从上面的几点可以看出,在这种情况下不需要使用值:

var Model = function (id) {
    var self = this;
    self.times = ko.observableArray();

    self.ref = firebase.child("users/" + id);

    // loads all data at this path, regardless of whether it existed
    // before or after I establish this listener
    self.ref.on("child_added", self.addChild.bind(self));

    self.addChild = function (snapshot) {
        self.times.push(snapshot.val());
    }
};