Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Firebase中跟踪儿童计数_Javascript_Transactions_Firebase - Fatal编程技术网

Javascript 如何在Firebase中跟踪儿童计数

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

我正试图跟踪firebase中某条路径包含多少子对象。我一直在尝试使用on('child_added')和on('child_removed')回调来更新计数,但即使对于现有的子级,它们也会被调用。是一个代码笔在演示这一点。我还希望能够编写一个安全规则,确保计数始终正确,但似乎没有办法获取对象中的子对象数

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