Javascript 事件和触发器不';不适用于模型和视图

Javascript 事件和触发器不';不适用于模型和视图,javascript,jquery,backbone.js,backbone-views,backbone-events,Javascript,Jquery,Backbone.js,Backbone Views,Backbone Events,我有以下型号: App.Item = Backbone.Model.extend({ urlRoot : '/item', // Default attributes defaults: { user_has_liked: false, }, initialize: function(){ this.on(

我有以下型号:

    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);
        }
    },
为什么从不调用
midchange

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

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

如果你是在一个视图中写的

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


此处
将引用视图,因此您需要引用模型(触发模型是正确的方式)。

因此中的

this.trigger('item-id-changed', itemId)
视图和
是否在中

this.on('item-id-changed', this.onItemIdChange)
这就是模型。如果某个主干对象,
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中尝试@aditThe
this
,正确吗?这是正确的@muistooshort,但是你必须倾听触发它们的事件,所以它当然不起作用。也许您需要一个全局事件总线。但是我要触发的模型不是与此视图关联的模型。。假设您在视图的initialize中声明为
var myModel=new app.SomeModel()
so write
this.someModel=myModel
然后在函数中作为
this.someModel.trigger(…)
写入
this.somModel
将使“someModel”可用于整个视图。