骨干路由器不触发路由
我有以下路由器:骨干路由器不触发路由
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),我发现它不支持我想要做的,但是有什么办法来完成这个?
我会在你的engage.app对象创建一个事件管理器,例如:
var vent = _.extend({}, Backbone.Events);
然后在你的路由器做了收件箱路线:
vent.trigger('inbox:show', page);
并处理事件engage.app对象,执行过去在路由处理程序中的代码。
现在,您不必调用appRouter.navigate
就可以触发相同的事件。
此外,从该处理程序,您可以调用appRouter.navigate('inbox');
而不传递true。现在,您可以将应用程序设置为您想要的状态,而不用强制路线。
这就是我最终做的;虽然它创建了一些额外的代码,但它看起来像是一个不错的解决方案 – 2012-02-26 03:36:31
@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
另一种选择就是要调用的方法
appRouter.inbox();
至于我可以告诉...至于使用appRouter.navigate('inbox', {trigger: true});
按预期工作骨干0.9.10的。
骨干源码仍然有这样的:'if(this.fragment === fragment)return;',所以我认为Gavin的问题依然存在。另外,source有一个注释:'如果你想让路由回调被触发(通常不需要)',options对象可以包含'trigger:true''。 – 2013-02-19 04:14:37
不是你的问题的答案,但也许是一个解决方案(如果我正确地得到你的答案):(重新)渲染你的页面/你最父视图,例如'appView.render()'。 – SunnyRed 2012-02-25 21:37:14