【问题标题】:Backbone Router not triggering route骨干路由器不触发路由
【发布时间】:2012-02-25 21:06:05
【问题描述】:

我有以下路由器:

appRouter = Backbone.Router.extend({
  routes: {
    '': 'inbox',
    'inbox': 'inbox',
    'discussions_engagement': 'contacts',
  },

  inbox: function(page) {
    console.log('inbox');
    var page = page || 1;
    engage.app.hydrateInbox(page, engage.app.showInbox);
  },
  ....
};

当我在 http://[...]/#inbox 并且我打电话时

appRouter.navigate('inbox', {trigger: true});

收件箱操作不会触发,这是我想要实现的。现在我查看了 Backbone 的来源(https://github.com/documentcloud/backbone/blob/master/backbone.js#L1027),我发现它不支持我正在尝试做的事情,但是有什么方法可以做到这一点?

【问题讨论】:

  • 不是您问题的答案,但也许是一个解决方案(如果我理解正确的话):(重新)呈现您的页面/您的最父视图,例如appView.render().

标签: javascript backbone.js


【解决方案1】:

我会在你的 engage.app 对象中创建一个事件管理器,如下所示:

var vent = _.extend({}, Backbone.Events);

然后在您的路由器中为收件箱路由执行此操作:

vent.trigger('inbox:show', page);

并在engage.app 对象中处理该事件,在那里执行过去在路由处理程序中的代码。

现在,您可以触发相同的事件,而不是调用 appRouter.navigate

此外,从该处理程序中,您可以调用 appRouter.navigate('inbox'); 而不传递 true。现在您可以让您的应用达到您想要的状态,而无需尝试强制路由。

【讨论】:

  • 这就是我最终做的;似乎是一个不错的解决方案,尽管它确实创建了一些额外的代码。
  • @JasonStonebraker This link 解释了这个想法。这种模式对我来说效果很好。它给路由器留下了一个单一的工作,即基于浏览器 URL 更改的路由。这个问题是关于当您已经在该路线上时尝试触发路线。此解决方案不是解决方法 (IMO),而是更好的设计。
【解决方案2】:

据我所知...从 Backbone 0.9.10 开始,使用 appRouter.navigate('inbox', {trigger: true}); 可以正常工作。

【讨论】:

  • Backbone 源码还是有这个:if (this.fragment === fragment) return;,所以我觉得 Gavin 的问题还是存在的。此外,来源有一条评论:“如果您希望触发路由回调(通常不希望),则选项对象可以包含 trigger: true”。
【解决方案3】:

另一种选择就是调用方法

appRouter.inbox();

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多