关于这个问题有很多争论,我认为很多争论源于我认为路由器正式被称为控制器的混淆。到去年年底我开始使用 Backbone 时,已经做出了改变,但我相信很多人已经围绕路由器作为控制器构建了应用程序。我从来不同意这一点。对我来说——依赖于早在 Backbone 创建之前就构建了类似于 Backbone 的专有 MVC 引擎的经验——路由器只是一个历史管理器组件。
因此,要解决您在决定如何最好地实现路由器方面的特定问题,请考虑以下几点:
- 首先,路由器不是应用程序的必要组件。您可以在没有路由器的情况下继续导航到应用程序的各个页面或屏幕。
- 路由器不是控制器,因为它的主要功能是管理历史。尽管您可以在路由器中嵌入应用程序业务逻辑,但我总是发现这会混淆路由器的实际功能。
- 通过使路由器成为应用程序的组件,您可以创建更好的关注点分离,并且可以拥有更有效的发布/订阅类型的安排。
下面是我在我的应用程序中使用的路由器模块的代码,它遵循调解器、发布/订阅模式:
/**
* The idea behind this component is simply to relegate Backbone.Router to
* doing what it does best: History Management. All it is responsible for
* is two things:
*
* 1. Update the URL if router.navigate is invoked
* 2. Trigger a routeChanged event if the URL was updated either by a bookmark or
* typed in by a user.
*/
define(function () {
return Backbone.Router.extend({
initialize : function (map) {
this._reversedMap = this.reverseModuleMap(map);
},
routes:{
'*actions':'notify'
},
notify:function (actions) {
var args = arguments;
this.trigger("routeChanged", {command:actions});
},
/**
* Override Backbone.Router.navigate. Default is to pass a router fragment, but for
* our uses, we'll translate the "route" into a module mapping so that the controller
* will know which module to display.
* @param param
* @param options
*/
navigate:function (param, options) {
//console.log('navigate', param);
if(!param.suppressNavigate && param.actionCommand) {
Backbone.Router.prototype.navigate.call(this, this._reversedMap[param.actionCommand]);
} else if(!param.actionCommand) {
Backbone.Router.prototype.navigate.call(this, param, options);
}
},
/**
* this function simply reverses the key and value of the "map"
* @param map
*/
reverseModuleMap:function (map) {
var newMap = {};
_.each(map, function (value, key) {
newMap[value] = key;
});
// reversed key and value
return newMap;
}
});
});
然后,当我实例化组件时,我向它传递一个映射,以便我的控制器知道要导航到哪个模块:
this._router = new Router({
_default: 'moduleA',
sites : 'moduleA',
apps : 'moduleB'
});
this._router.on('routeChanged', this.handleRouteChange, this);
我发现它最重要的一点是它使代码保持美观和简单,并允许我专注于控制器中的业务逻辑。