Backbone多次收听

时间:2014-05-03 14:48:32

标签: javascript backbone.js

我知道函数listenTo,我需要在困难的条件下应用它。我有一个数组,每个数组的入口都是对集合的引用。我需要等待所有集合都被完全取出。我的fetch函数集合通过reset函数存储数据。我听了事件重置。

var postTwitter= new Array(); 
var postInstagram= new Array();

var i=0;
    _.each(AttoriCollectionDb.models, function (model) {
        postTwitter[i]=new Posts();
        postTwitter[i].fetch({'user_id':model.get("id_twitter"),'type':'twitter'});
        postInstagram[i]=new Posts();
        postInstagram[i].fetch({'user_id':model.get("id_instagram"),'type':'instagram'});
        i++;

      });


      this.listenTo(postTwitter[0], 'reset', ok1);// now wait only one collection but I need wait all collection completely fetched.

在上面的代码中,我只等待一次收集重置,如何在所有收集都有重置事件的情况下收听?

2 个答案:

答案 0 :(得分:1)

如果在Posts集合的初始化中写'on'怎么样?

var Posts = Backbone.Collection.extend({initialize: function () {
    this.on('reset', ok1);
}}); 

答案 1 :(得分:1)

所以这是我的方法:

1)添加自定义事件"重置:allPosts"当所有帖子都被解雇时触发"重置"

2)收集"重置"触发你想要被调用(所有的帖子Instagram +推特)。我将此命名为#34; totalPosts"

3)设置一个范围变量" totalResetted",这样你就可以在Post发布之后逐步添加" reset"

4)每次"重置"解雇后,在" totalResetted"中添加一个并检查" totalResetted"等于" totalPosts"。如果它相等,那意味着所有帖子都被解雇了#34;重置"

这是我想出的:

var postTwitter= new Array(); 
var postInstagram= new Array();

var totalPosts= AttoriCollectionDb.models.length * 2; // Times two because we're adding Twitter and Instagram 
var totalResetted= 0;

var checkResetted = function() { 
  totalResetted++;
  if (totalPosts === totalResetted) this.trigger('reset:allPosts');
}

// When all posts are 'reset' then do something;
this.on('reset:allPosts', function(){ alert('all posts fired reset!!') });

var i=0;
var that = this;
    _.each(AttoriCollectionDb.models, function (model) {
        postTwitter[i]=new Posts();
        that.listenToOnce( postTwitter[i], 'reset', checkResetted);
        postTwitter[i].fetch({'user_id':model.get("id_twitter"),'type':'twitter'});

        postInstagram[i]=new Posts();
        that.listenToOnce( postInstagram[i], 'reset', checkResetted);
        postInstagram[i].fetch({'user_id':model.get("id_instagram"),'type':'instagram'});

        i++;

      });