0

我有以下模型:

    App.Item = Backbone.Model.extend({
            urlRoot : '/item',
            // Default attributes
            defaults: {
                user_has_liked: false,
            },
            initialize: function(){
                this.on('item-id-changed', this.onItemIdChange);
            },
          onItemIdChange: function(itemId){
            console.log('item id change');
            this.set({'id': itemId});
            var that = this;
            this.fetch({
                success: function (item) {

                }
            })  
        },

以及点击时的以下触发器:

在我的另一个观点上,这不是这个模型绑定到我的观点:

loadNewItem: function(ev) {
        ev.preventDefault();
        var self =  $(ev.currentTarget);
        var itemId = $(self).attr('data-item-id');
        //trigger a new event for listener
        if (itemId) {
            console.log('triggger');
            this.trigger('item-id-changed', itemId);
        }
    },

为什么它onItemIdChange从未被调用?

4

3 回答 3

0

如果你在视图中写这个,

利用this.model.trigger('item-id-changed', itemId);

这里this将引用视图,因此您需要引用模型(触发模型是正确的做法)。

于 2013-09-12T07:08:12.610 回答
0

所以this

this.trigger('item-id-changed', itemId)

是视图并且this

this.on('item-id-changed', this.onItemIdChange)

是模型。如果某个 Backbone 对象o正在触发事件,那么您必须o.on(...)收到有关这些事件的通知。您在视图上触发事件,但在模型上侦听这些事件,因此不会发生任何有用的事情。

我的印象是你真的想要一个全局事件总线:

app.events = _({}).extend(Backbone.Events);

app您的应用程序的全局命名空间在哪里。然后你会说:

app.events.trigger('item-id-changed', itemId);

在您看来,您的模型将:

app.events.on('item-id-changed', this.onItemIdChange, this);

注意 的第三个context参数on,它确保this内部onItemIdChange是您期望的(即模型)。或者,您可以在模型的构造函数中使用_.bindor_.bindAll将方法绑定到实例,那么您就不需要on.

off当你的模特离开时,别忘了打电话。

这是该技术的简化演示:http: //jsfiddle.net/ambiguous/dc523/

于 2013-09-13T02:26:58.350 回答
0

尝试改变这一点:

this.on('item-id-changed', this.onItemIdChange);

对此:

this.on('change:item-id-changed', this.onItemIdChange, this);
于 2013-09-12T06:16:26.847 回答