为什么我们不能在togglestatus函数内声明this.render?

时间:2015-02-23 03:34:08

标签: javascript jquery backbone.js

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

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

之前:

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()));
    }

});

1 个答案:

答案 0 :(得分:0)

我还没看过文章

首先,为什么this.render不能用于其他模型更改只是因为在toggleStatus代码中调用Before时,只有时间输入更改事件才会触发

所以流程就像......

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

  2. this.events收到该活动并致电toggleStatus,然后在this.render

  3. 内调用toggleStatus

    After代码中,您正在调用model.on,这是一个为模型事件设置侦听器的函数,toggleStatus被设置为它的回调函数。

    所以,流程将是......

    1.无论模型何时更改,model.on都会获取事件并调用回调函数this.render

    这意味着当模型属性得到任何更改时,this.render会被调用。而change input调用toggleStatus会对模型进行更改(我不知道因为你没有& #39; t输入它的代码,但我几乎可以确定它,输入更改最终调用this.render(并且任何其他模型属性更改也调用this.render)

    AYI,我认为这些文章有点陈旧,因为model.on不适合再使用,而是更好地使用listenTo代替。因为model.on很难取消绑定事件而且它会让僵尸变得僵尸轻松查看。

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