Backbone pubsub - 全局事件在页面加载时不触发默认路由

时间:2014-06-25 21:17:26

标签: javascript backbone.js underscore.js publish-subscribe

我用Backbone创建了一个pubSub对象:

App.Vent = _.extend({}, Backbone.Events);

我还创建了一个路由器,它在默认的uri上触发全局事件:http://localhost/

App.Router = Backbone.Router.extend({
    routes: {
        '': 'default',
    },

    default: function() {
        App.Vent.trigger('contactsTable:show');
    }
});

App.Views.ContactsTable = Backbone.View.extend({

    tagName: 'ul',

    initialize: function() {
        App.Vent.on('contactsTable:show', this.updateApp, this);
    },

    updateApp: function() {
        console.log( 'Show All Contacts' );
    }

});

new App.Router;
Backbone.history.start();
new App.Views.ContactsTable;

方法default已成功调用,但该方法中的事件(contactsTable:show 会被触发。

但是,如果我最初加载页面说:http://localhost/#contacts然后从那里导航回http://localhost/,则会在路由器方法内触发 事件。< / p>

我无法弄清楚为什么会这样。我需要在默认路由上触发事件,无论它是否是打开应用程序时的第一条路径。

2 个答案:

答案 0 :(得分:0)

看起来App.Vent中没有任何东西绑定到联系人表:显示&#39;,请添加以下行并检查您是否在控制台中看到该消息。

App.Vent.bind("contactsTable:show", function(){
    console.log('Inside - contactsTable:show');
});

答案 1 :(得分:0)

要回答我自己的问题,我的问题是在我的视图中绑定事件侦听器之前routerBackbone.history.start()被称为

发生这种情况是因为我的视图(包含侦听器)在AJAX请求的回调函数中被实例化,而RouterBackbone.history.start()在执行之前被执行了服务器返回了一个响应。

这是我在定义模型,视图集合和路由器之后的工作代码:

var contactsCollection = new App.Collections.Contacts();
contactsCollection.fetch().then(function() {

    var contactsTableView = new App.Views.ContactsTable({
        collection: contactsCollection
    });

    new App.Router;
    Backbone.history.start();

});

我视图中的监听器现在响应初始页面加载时的事件。