我的应用程序中有HeaderView
个视图。根据触发的路线,视图获得自定义标题。该视图订阅了headerview:titleChanged
事件。
headerview.js
var HeaderView = Backbone.View.extend({
el: $('#header-region'),
initialize: function() {
bus.on('headerview:titleChanged', function(args) {
this.setTitle(args.title);
}, this);
this.render();
},
setTitle: function(title) { this.$el.find('.title').html(title); },
render: function() { return this; }
});
在 router.js
var AppRouter = Backbone.Router.extend({
initialize: function() { this.route('', 'defaultRoute'); }
});
// trying to create it before AppRouter even got initialized
new HeaderView();
var appRouter = new AppRouter();
appRouter.on('route:defaultRoute', function() {
_routeHandlers.renderDefaultContentRegion();
});
Backbone.history.start();
在 router.js,_routeHandlers.renderDefaultContentRegion()
// trying to send message
bus.trigger('headerview:titleChanged', {title: 'heading text'});
问题是首先创建路由器,然后创建标题视图,结果没有headerview:titleChanged
收件人。
是否可以在默认路由被触发之前呈现HeaderView
?我该如何处理?
答案 0 :(得分:1)
HeaderView
可能是应用程序的一个重要部分,因此它应该在应用程序启动时创建,问题是获得正确的顺序。您可以劫持AppRouter#initialize
作为您的应用程序构造函数,并让它在适当的时间创建HeaderView
:
var AppRouter = Backbone.Router.extend({
initialize: function() {
this.route('', 'defaultRoute');
new HeaderView();
bus.trigger('headerview:titleChanged', {title: 'heading text'});
}
演示:http://jsfiddle.net/ambiguous/dpSbB/
或者,您可以将所有初始化移动到单独的应用程序构造函数中,然后按正确的顺序排列。这也为您提供了放置全局内容(例如事件总线)的便利位置,而无需担心污染全局命名空间。像这样:
var AppRouter = Backbone.Router.extend({
initialize: function() {
this.route('', 'defaultRoute');
},
//...
});
var app = {
bus: _({}).extend(Backbone.Events),
initialize: function() {
new HeaderView;
new AppRouter;
app.bus.trigger('headerview:titleChanged', {title: 'heading text'});
Backbone.history.start();
}
};
app.initialize();