Javascript 订阅者(对于自定义事件)不';不存在。backbone.js

Javascript 订阅者(对于自定义事件)不';不存在。backbone.js,javascript,jquery,events,backbone.js,Javascript,Jquery,Events,Backbone.js,在我的应用程序中有HeaderView视图。根据触发的路由,视图将获得一个自定义标题。视图订阅了headerview:titleChanged事件 headerview.js var HeaderView = Backbone.View.extend({ el: $('#header-region'), initialize: function() { bus.on('headerview:titleChanged', function(args) {

在我的应用程序中有
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; }
});
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();
在路由器.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; }
});
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()

问题是首先创建路由器,然后创建头视图,结果没有
headerview:titleChanged
recipient


是否可以在触发默认路由之前渲染
HeaderView
?我该如何处理呢?

HeaderView大概是应用程序的一个重要部分,因此应该在应用程序启动期间创建,问题是如何正确地获得订单。您可以劫持
AppRouter#initialize
作为您的应用程序构造函数,并让它在正确的时间创建
HeaderView

var AppRouter = Backbone.Router.extend({
    initialize: function() {
        this.route('', 'defaultRoute');
        new HeaderView();
        bus.trigger('headerview:titleChanged', {title: 'heading text'});
    }
演示:

或者,您可以将所有初始化移到一个单独的应用程序构造函数中,并让它按正确的顺序排列。这还为您提供了一个方便的位置来放置全局内容(例如事件总线),而不必担心会污染全局名称空间。大概是这样的:

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();

演示:

另一个问题是,当应用程序在非默认路径启动时,消息会被覆盖。你有什么想法吗?我不知道默认的路由处理程序会被调用:不管你是从某个路由开始,比如说
/app/#sample_route
,还是默认的route@brick:你把那些问题弄明白了吗?抱歉,您的评论在途中丢失了。还没有。在JSFIDLE,它工作得相当好。我尝试添加额外的路由处理程序,这对我很有效。在
show
模式下,即使在刷新后也会显示预期的文本。在我的环境中,这不会发生。我将去掉所有不必要的代码,并重新生成错误。