Backbone.js - 更改名称更改时不会触发

时间:2013-01-22 07:02:16

标签: backbone.js backbone-views

在我的骨干函数中,虽然名称改变了改变函数根本没有触发..任何人都建议我正确的方式来获取它..(实际上我需要更改的东西,需要更新);

代码:

    (function($){

var list = {};

list.model = Backbone.Model.extend({
  defaults:{
    name:'need the name'
  },
  initialize:function(){
    this.bind('change:name', function(model) {
        console.log('Model->change()', model);
    });
  }
});

list.collect = Backbone.Collection.extend({
  model:list.model,
  url : 'data/names.json',
  initialize:function(){
    this.fetch({update:true});
    this.keepUpdate();
  },
  keepUpdate:function(){
    var that = this;
    var updateData = function(){
      that.fetch({update:true});
      myTimeout = setTimeout(updateData,10000);
    }
    var myTimeout = setTimeout(updateData,10000);
  }
});


list.view = Backbone.View.extend({
  initialize:function(){
    this.collection = new list.collect();
    this.collection.on("update", this.render, this);
    this.collection.bind("change:name", function(model, attributes){
      console.log(model,attributes,'property changed'); // this is not triggering at all..
    });
  },
  render:function(data){
    _.each(this.collection.models, function(data){
      //console.log(data.get('name')); it works fine
    })
  },
  updateName:function(){
    console.log('updated called');
  }
});

var newView = new list.view();    

})(jQuery)

3 个答案:

答案 0 :(得分:1)

Collection.fetch不会触发change事件。您只能获得reset个活动。如果您需要更精细的事件,请考虑使用选项{update:true}调用fetch

that.fetch({update:true});

这将为集合中已有的每个模型触发change事件,如果模型以前不在集合中,则为add

答案 1 :(得分:0)

尝试从集合中删除keepUpdate,并在结尾处将setTimeout放入视图的initialize函数中。我建议从视图中调用fetch以及this.collection.fetch()而不是集合的初始化函数。使您的代码更具可重用性。

答案 2 :(得分:0)

我不确定我理解你的问题。你想要实现什么目标?

我认为fetch不接受{add:true}作为参数(我刚检查了源代码,但它没有出现在任何地方)。

fetch完成时,它只触发reset事件(不是add)。如果你想在集合的内容发生变化时做某事,你应该听听。您还可以简化收听change