2012-02-25 146 views
6

我有以下路由器:骨干路由器不触发路由

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:// [...] /#收件箱和我打电话

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

收件箱动作不会触发这是我想要达到的目标。现在我已经看了Backbone的来源(https://github.com/documentcloud/backbone/blob/master/backbone.js#L1027),我发现它不支持我想要做的,但是有什么办法来完成这个?

+1

不是你的问题的答案,但也许是一个解决方案(如果我正确地得到你的答案):(重新)渲染你的页面/你最父视图,例如'appView.render()'。 – SunnyRed 2012-02-25 21:37:14

回答

4

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

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

然后在你的路由器做了收件箱路线:

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

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

现在,您不必调用appRouter.navigate就可以触发相同的事件。

此外,从该处理程序,您可以调用appRouter.navigate('inbox');而不传递true。现在,您可以将应用程序设置为您想要的状态,而不用强制路线。

+0

这就是我最终做的;虽然它创建了一些额外的代码,但它看起来像是一个不错的解决方案 – 2012-02-26 03:36:31

+0

@JasonStonebraker [此链接](http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/)解释了这个想法。这种模式对我来说效果很好。它使用单个作业离开路由器,这是基于浏览器URL更改的路由。这个问题是关于当你已经在那条路线上时尝试触发路线。此解决方案不是解决方法(IMO),而是更好的设计。 – 2013-02-19 04:01:32

-1

另一种选择就是要调用的方法

appRouter.inbox(); 
2

至于我可以告诉...至于使用appRouter.navigate('inbox', {trigger: true});按预期工作骨干0.9.10的。

+0

骨干源码仍然有这样的:'if(this.fragment === fragment)return;',所以我认为Gavin的问题依然存在。另外,source有一个注释:'如果你想让路由回调被触发(通常不需要)',options对象可以包含'trigger:true''。 – 2013-02-19 04:14:37