父对象的每一个“孩子”需要被订阅的事件聚合固定事件:例如:
var dispatcher = EventAggregator.create();
有在应用程序的多个“若干意见”,所有意见必须订阅close事件。 使用主要成分:
Backbone.View.prototype.close = function(){
//close logic
};
现在每个视图需要订阅的事件聚合即“close”事件var dispatcher
,而无需显式调用做到这一点的方法。 也就是说,不是不断说:
dispatcher.on('close', this.close)
或ParentView.prototype.someMethod.apply()
在每一个观点,即是Backbone.View的一个实例是有办法有自动订阅的所有观点close
的调度事件?
难道是这样的工作:(似乎并不在我的情况,因为this
被绑定到窗口:)
Backbone.View.prototype.subscribeClose: (function(){
dispatcher.on('close',this.close);
})();
因为这将失败, this
是必然的窗口。 这将是一个更好的方式来退出这个功能还是我必须手动调用父/原型方法,以确保订阅总是会发生? 是否有JS说我可能不知道的“另一个”的方式?
更新 :添加小提琴这两种观点应该触发“玉兰油”,但只有一个视图,其中subscribeOnClose
添加到原型似乎是工作的罚款(试行按丹的答案)。 这两种观点都没有到触发响应,但。 只需用仿真模型中的触发器现在。
更新
我不想把这个,除非真的有必要,但如果你真的希望这适用于所有视图的情况下,而不需要让他们从自己的自定义基本视图类下降,你可以尝试这样的事情(覆盖Backbone.View
,内置的基本视图类的构造函数):
http://jsfiddle.net/D9gR7/5/
$( document ).ready( function () {
// Create your actual object here
var dispatcher = _.clone( Backbone.Events );
( function () {
var ctor = Backbone.View;
Backbone.View = Backbone.View.extend( {
constructor : function ( options ) {
ctor.apply( this, arguments );
dispatcher.on( 'close', this.close, this );
},
// constructor
close : function () {
console.log( this.cid );
}
// close
} );
Backbone.View.prototype.constructor = Backbone.View;
} )();
var View = Backbone.View.extend( {} );
var views = [];
var i;
for ( i = 0 ; i < 10 ; ++i ) {
views.push( new Backbone.View );
}
for ( i = 0 ; i < 10 ; ++i ) {
views.push( new View );
}
dispatcher.trigger( 'close' );
} );
原来的答案
有你的代码一堆问题。 什么是这样的(参见控制台输出,很明显)? 我认为这是相当多的,你要去什么。 你只需要确保你调用父类initialize()
当你重写子类中的方法。 另外,如果你想在某个时候完全吹走的观点的情况下,确保你调用dispatcher.off( null, null, view_instance )
http://jsfiddle.net/D9gR7/
$( document ).ready( function () {
// Create your actual object here
var dispatcher = _.clone( Backbone.Events );
var View = Backbone.View.extend( {
initialize : function ( options ) {
dispatcher.on( 'close', this.close, this );
},
close : function () {
console.log( this.el.id );
}
} );
var Some_Kind_Of_View = View.extend( {
initialize : function ( options ) {
View.prototype.initialize.apply( this, arguments );
// ...
}
} );
var view1 = new View( {
el : $( "#MyDiv" )[0],
} );
var view2 = new Some_Kind_Of_View( {
el : $( "#MyDiv2" )[0]
} );
dispatcher.trigger( 'close' );
} );
与你的示例代码的一些问题:
var V1 = Backbone.View.extend({
// JMM: If you pass `el` to `extend()`, any instances you create
// from the class will be tied to the same DOM element, unless
// you pass a different `el` to the view constructors. Maybe
// that's what you want.
el: '#MyDiv',
initialize: function() {
var self = this;
// JMM: You're assigning `undefined` to this prototype
// property. And you're trying to register the
// return value of self.alert() (`undefined`) as
// the handler for the `olay` event.
Backbone.View.prototype.subOnClose = (function(){
model.on('olay',self.alert('olay'));
})();
},
alert: function(s) {
alert('V1 -->' + s);
}
});
文章来源: How to have self-executing function in an object's prototype be auto-run for all children in JavaScript?