【问题标题】:subscriber (for a custom event) doesn't exist. backbone.js订阅者(用于自定义事件)不存在。骨干.js
【发布时间】:2013-09-14 08:36:59
【问题描述】:

我的应用程序中有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?我该如何处理?

【问题讨论】:

    标签: javascript jquery events backbone.js


    【解决方案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();
    

    演示:http://jsfiddle.net/ambiguous/eLyys/

    【讨论】:

    • 另一个问题是,当应用程序以默认消息以外的路由启动时,会被覆盖。你有什么想法吗。
    • 我不知道默认路由处理程序会被调用:无论您是从某个路由开始,比如 /app/#sample_route 还是默认路由
    • @brick:这些问题你解决了吗?抱歉,您的 cmets 在途中迷路了。
    • 还没有。在 jsfiddle 它工作得很好。我试图添加额外的路由处理程序,它对我有用。在show 模式下,即使在刷新后它也会显示预期的文本。在我的环境中,这不会发生。我将删除所有不必要的代码并重现错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多