在我的骨干函数中,虽然名称改变了改变函数根本没有触发..任何人都建议我正确的方式来获取它..(实际上我需要更改的东西,需要更新);
代码:
(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)
答案 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
。