Javascript 如何在Firebase中跟踪儿童计数
我正试图跟踪firebase中某条路径包含多少子对象。我一直在尝试使用on('child_added')和on('child_removed')回调来更新计数,但即使对于现有的子级,它们也会被调用。是一个代码笔在演示这一点。我还希望能够编写一个安全规则,确保计数始终正确,但似乎没有办法获取对象中的子对象数Javascript 如何在Firebase中跟踪儿童计数,javascript,transactions,firebase,Javascript,Transactions,Firebase,我正试图跟踪firebase中某条路径包含多少子对象。我一直在尝试使用on('child_added')和on('child_removed')回调来更新计数,但即使对于现有的子级,它们也会被调用。是一个代码笔在演示这一点。我还希望能够编写一个安全规则,确保计数始终正确,但似乎没有办法获取对象中的子对象数 <script src="http://www.polymer-project.org/platform.js"></script> <link rel="imp
<script src="http://www.polymer-project.org/platform.js"></script>
<link rel="import" href="http://www.polymer-project.org/components/polymer/polymer.html">
<script src="https://cdn.firebase.com/js/client/1.1.2/firebase.js"></script>
<polymer-element name="my-element">
<template>
<div>
<h1>Posts ({{count}})</h1>
<template repeat="{{key in keys}}">
<span>{{posts[key].content}} </span>
</template></br>
<button on-click="{{addPost}}">Add Post</button>
<button on-click="{{removePost}}">Remove Post</button>
</div>
</template>
<script>
Polymer('my-element', {
addPost: function () {
var self = this;
self.ref.child('posts').push({content: 'YO'});
},
removePost: function () {
if (this.keys.length > 0) {
var self = this;
var topId = self.keys[0];
self.ref.child('posts/' + topId).remove();
}
},
ready: function () {
var baseUrl = "https://transaction-test.firebaseio.com";
var self = this;
self.ref = new Firebase(baseUrl);
self.ref.child('posts').on('value', function (snap) {
self.posts = snap.val();
self.keys = Object.keys(self.posts);
});
self.ref.child('postsCount').on('value', function (snap) {
self.count = snap.val();
});
self.ref.child('posts').on('child_added', function (snap) {
self.ref.child('postsCount').transaction(function (count) {
return count + 1;
});
});
self.ref.child('posts').on('child_removed', function (snap) {
self.ref.child('postsCount').transaction(function (count) {
return count - 1;
});
});
}
});
</script>
</polymer-element>
<my-element></my-element>
职位({count}})
{{posts[key].content}
添加帖子
撤职
聚合物(“my-element”{
addPost:function(){
var self=这个;
self.ref.child('posts').push({content:'YO'});
},
removePost:函数(){
如果(this.keys.length>0){
var self=这个;
var topId=self.keys[0];
self.ref.child('posts/'+topId).remove();
}
},
就绪:函数(){
var baseUrl=”https://transaction-test.firebaseio.com";
var self=这个;
self.ref=新Firebase(baseUrl);
self.ref.child('posts')。on('value',函数(snap){
self.posts=snap.val();
self.keys=Object.keys(self.posts);
});
self.ref.child('postsCount')。on('value',函数(snap){
self.count=snap.val();
});
self.ref.child('posts')。on('child_added',函数(snap){
self.ref.child('PostScont')。事务(函数(计数){
返回计数+1;
});
});
self.ref.child('posts')。on('child_removed',函数(snap){
self.ref.child('PostScont')。事务(函数(计数){
返回计数-1;
});
});
}
});
添加的子对象
和删除的子对象
事件将为添加到客户端的每个子对象触发,因此从服务器下载(或本地添加)的所有内容都将触发
你的想法是保留一个单独的postcount
,这是个好主意。但是,您应该从addPost
和removePost
触发它,而不是从child\u added
和removePost
触发它
大概是这样的:
addPost: function () {
var self = this;
self.ref.child('posts').push({content: 'YO'}, function(error) {
if (!error) {
self.ref.child('postsCount').transaction(function (count) {
return count + 1;
});
}
});
},
removePost: function () {
if (this.keys.length > 0) {
var self = this;
var topId = self.keys[0];
self.ref.child('posts/' + topId).remove(function(error) {
if (!error) {
self.ref.child('postsCount').transaction(function (count) {
return count - 1;
});
}
});
}
},
请注意,您的代码目前是多种方法的混合和匹配。如果你已经收到了所有帖子,你可以在那里简单地数一数:
self.ref.child('posts').on('value', function (snap) {
self.posts = snap.val();
self.keys = Object.keys(self.posts);
self.count = snap.numChildren();
});