关于在Backbone中监听模型的变化有点困惑

时间:2013-09-06 23:58:55

标签: javascript backbone.js

所以我想把jQuery应用程序移到骨干网上。我有一个View,我传递一个集合,创建一个视图列表,每个视图都通过模型。该视图将信息输出到输入中。有没有办法,我可以自动从视图传播到相关模型,或者这是为我自动完成的。

比如说我有一个看起来像这样的视图:

enter image description here

我有以下内容,当我更新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

2 个答案:

答案 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);