首先Marionette的AppAouter的hook留的太少,只有一个onRoute方法可以用,而且这个方法是发生在route之后,对于单页面程序来说,有一些动作比如当用户手动refresh页面那么reset layout还是希望在route之前来做,因为绝大多数的开发人员只用调用mainRegion.show(view),而mainRegion只是layout的一个区域。
backbone.routefilter提供了before,after等丰富的hook点,但是因为Marionetter提倡要小的controller,导致每个模块都是以下类代码,
var xxController = Marionette.Controller.extend({...});
app.addInitializer(function () {
new Marionette.AppRouter({
appRoutes: {
'a(/)': 'process_A',
'b(/)': 'process_B'
},
controller: new xxController()
});
});
这样的代码是没办法跟backbone.routefilter一起工作,因为AppRouter是继承自Backbone的Router的,所以解决的方法就是给AppRouter.prototype加上hook点,这样backbone.routefilter就能工作了。
_.extend(Marionette.AppRouter.prototype,{before:function(route,args){
...
},
after:function(route,args){
...
}
});