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