2015-02-23 125 views
0

开始学习Backbone JS。阅读Codeschool文档。我只是不明白为什么我们需要在initialize中声明this.model.on('....'),而不是在toggleStatus函数中只使用'this.render();'。请有人解释清楚。为什么我们不能在togglestatus函数中声明this.render?

下面是代码从我的文档复制粘贴:

前:

var TodoView = Backbone.View.extend({ 

    events: { 
     'change input': 'toggleStatus' 
    }, 

    toggleStatus: function(){ 
     this.model.toggleStatus(); 
     this.render(); //Doesn’t work for other model changes , WHY IT DOESN'T WORK?? 
    }, 

    render: function(){ 
     this.$el.html(this.template(this.model.toJSON())); 
    } 

    } 
}); 

后:

var TodoView = Backbone.View.extend({ 

    events: { 
    'change input': 'toggleStatus' 
    }, 

    initialize: function(){ 
     this.model.on('change', this.render, this); 
    }, 

    toggleStatus: function(){ 
     this.model.toggleStatus(); 
    }, 

    render: function(){ 
     this.$el.html(this.template(this.model.toJSON())); 
    } 

}); 

回答

0

我没有看过的文章尽管

首先,为什么this.render不适用于其他模型更改只是因为当调用toggleStatusBefore代码中只有时间输入更改事件触发。

所以流动是像...

  1. 用户更改输入字段值。

  2. this.events接收该事件,并呼吁toggleStatus,然后this.render被称为toggleStatus

After

,要调用model.on这是一个函数来设置一个侦听器模型事件和toggleStatus内被设置为它的回调函数。

因此,流程会...

1.Whenever模式得到改变,model.on获取事件和回调函数this.render被调用。

这意味着whenver模特属性得到任何的改变,this.render是called.and由于change input电话toggleStatus这使得该模型的变化(我不知道,因为你没有把它的代码,但我几乎可以肯定这件事),输入的变化最终会调用this.render(以及任何其他模特属性改变this.render太话费)

阿姨,我认为文章是有点老,因为model.on不适合使用了更好的使用listenTo取而代之。因为model.on很难解除事件并且它使得僵尸视图很容易。

查看更多信息http://backbonejs.org/#Events-listenTo

相关问题