我正在使用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
已经有value
,value
也会检索所有值。
作为替代方案,我可以在重新创建数组之前仅使用 .removeAll
和{{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());
}
};