backbone.js中没有绑定的自定义事件
我正在寻找一种更好的方法来实现带有主干的PubSub类型功能。我目前正在实现这一目标,但我正在寻找一种更好的方式来实现这一目标 示例路由代码backbone.js中没有绑定的自定义事件,backbone.js,Backbone.js,我正在寻找一种更好的方法来实现带有主干的PubSub类型功能。我目前正在实现这一目标,但我正在寻找一种更好的方式来实现这一目标 示例路由代码 var AppRouter = Backbone.Router.extend({ customEvents: _.extend({}, Backbone.Events), routes: { "login": "login" }, //Injecting custom event login: function(
var AppRouter = Backbone.Router.extend({
customEvents: _.extend({}, Backbone.Events),
routes: {
"login": "login"
},
//Injecting custom event
login: function(){
this.before(function () {
app.showView('#Content', new LoginView({customEvents:this.customEvents}), "login", true);
});
},
//Injecting custom event
otherView: function(){
this.before(function () {
app.showView('#Header', new OtherView({customEvents:this.customEvents}), "login", true);
});
},
..... more code
});
示例视图代码。请注意,我使用bind来侦听customEvent。这很好,但正在寻找替代方法
LoginView = Backbone.View.extend({
initialize: function(options){
this.customEvents = options.customEvents;
this.customEvents.bind('app:loggedin', this.loggedIn);
},
loggedIn: function(){
console.log("LOG CHANGED");
},
...more code
我更愿意将我的事件与我在视图中使用的其他事件一起保存。不知道如何实现这一点。我应该扩展视图类吗
我想就我的观点做些什么
LoginView = Backbone.View.extend({
events: {
"app:loggin" : "loggedIn"
},
loggedIn: function(){
console.log("LOG CHANGED");
},
...more code
要点:
演示:
代码预览:
// -- BASE VIEW ------------------
var BaseView = Backbone.View.extend({
constructor : function (options) {
Backbone.View.prototype.constructor.apply(this, arguments);
this._eventAggregator = options && options.eventAggregator || this;
this._parseTriggers();
},
_parseTriggers : function () {
_.each(this.triggers || {}, function (fn, event) {
var handler = this[fn];
if (_.isFunction(handler)) {
this.listenTo(this._eventAggregator, event, handler);
}
},
this);
}
});
// -- TEST ------------------
var View = BaseView.extend({
triggers : {
'hello' : 'helloHandler',
'bye' : 'byeHandler'
},
helloHandler : function (name) {
console.log('hello, ' + name);
},
byeHandler : function (name) {
console.log('bye, ' + name);
}
});
var view1 = new View();
view1.trigger('hello', 'dude 1'); // -> hello, dude 1
view1.trigger('bye', 'dude 1'); // -> bye, dude 1
var vent = _.extend({}, Backbone.Events);
var view2 = new View({eventAggregator:vent});
vent.trigger('hello', 'dude 2'); // -> hello, dude 2
vent.trigger('bye', 'dude 2'); // -> bye, dude 2
事件
已为UI事件保留。我建议扩展主干。查看并在那里实现此功能。我一有空就会写这个方法,这不仅对你很有用:)谢谢,这看起来正是我要找的,这个周末我要试一试。例如,是否应该有一个类似的函数来解除关闭方法上事件的绑定?思考类似Backbone.View.prototype.close=function(){this.remove();this.unbind();};我使用listenTo
方法更新了示例。在这种情况下,不需要解除绑定该触发器,绑定将随着视图“消亡”;var view2=新视图({eventAggregator:vent});您正在做与我相同的事情,注入一个全局事件“vent”,在视图之间共享。这样,我既可以同时跨多个视图进行广播,也可以通过使用触发器对象保持视图本身的整洁。