所以我想把jQuery应用程序移到骨干网上。我有一个View,我传递一个集合,创建一个视图列表,每个视图都通过模型。该视图将信息输出到输入中。有没有办法,我可以自动从视图传播到相关模型,或者这是为我自动完成的。
比如说我有一个看起来像这样的视图:
我有以下内容,当我更新this.update_value被调用。但我怎么知道哪个型号改变了?我可以获得引起change
事件的特定模型的引用吗?对不起,如果这听起来很基本。
var HomepagePositionView = Backbone.View.extend({
className:'row',
initialize:function(){
_.bindAll(this, "render");
this.listenTo(this.model, 'change', this.update_value);
},
render:function(){
var html="<div class='span2'>" + this.model.get('name') + "</div><div class='span1'><input type=text class='hp_score input-mini pull-right' value='" + this.model.get('hp_score') + "' /></div>";
$(this.el).html(html);
this.$('.hp_score').bind('change', this.update_model);
return this;
},
update_model:function(){
console.log('this model changed' + this.model.id); // this.model.id is not working
}
});
和
var HomepagePositionsView = Backbone.View.extend({
render:function(){
// iterate through collection and for each model create a HomepagePositionView
}
如果基础模型没有更改,我希望更新按钮为空白。如果我教会和州从90岁开始,Backbone是否有办法告诉哪些模型已经改变了? 95?
THX
答案 0 :(得分:2)
使用错误的范围调用update_model方法。在该方法中,“this”应该引用HomepagePositionView,但在您的情况下,它可能指的是触发事件的DOM元素。如果在视图上定义“事件”对象,则骨干视图将自动将方法绑定到具有正确范围的事件。有关详细信息,请参阅http://backbonejs.org/#View。 例如,在HomepagePositionView中删除以下行:
this.$('.hp_score').bind('change', this.update_model);
并在className变量后立即添加以下内容:
events: {
"change .hp_score": "update_model"
}
Backbone.View将自动绑定“update_model”方法,以使用hp_score类更改DOM元素上的事件。将使用正确的范围调用“update_model”方法,因此“this”将引用HomepagePositionView。
或者你可以像你现在尝试那样自己绑定事件,但是在initialize()方法而不是render()方法中执行它,因为每个视图可以多次调用render()。为了确保使用正确的作用域调用“update_model”方法,可以使用下划线“bind”方法创建绑定到当前作用域的新方法。像这样的东西(但如果你定义一个如上所述的“事件”对象,这也是不必要的):
var method = _.bind(this.update_model,this);
this.$('.hp_score').bind('change', method);
至于你的第二个问题,如果无论如何要判断一个模型是否已经改变,你唯一的方法就是自己听取基础模型上的“改变”事件。
希望这有帮助!
答案 1 :(得分:1)
最终,就像你说的那样,你想要拥有其中的集合(HomepagePositionsView)的视图来处理变化。
我不确定是否有一个existing backbone event(类似于收集要修改的集合中的模型),因为该视图只需一步即可收听,因此在我看来,最好的方法是是使用pub-sub模式。
在HomepagePositionView中:
update_value: function() {
Backbone.trigger('model changed', this.model); //sends off a custom event, attaching the changed model with it
}
然后,在HomepagePositionsView初始化时:
initialize: function() {
Backbone.on('model changed', this.dealwithChange, this); //binds this function to the event
}
...
dealWithChange: function(changedModel) {
//you can apply your logic to the changed model here.
}
(并确保在销毁HomepagePositionsView时调用Backbone.off('model changed', this.dealwithChange, this);
)