使用中介pub/sub模式时路由骨干应用程序
routing backbone apps when using mediator pub/sub patterns
我正在主干网中构建一个应用程序,该应用程序结合了来自https://github.com/addyosmani/backbone-aura/在模块之间发送消息以保持干净的代码库。
在aura的整个应用程序示例中,我对Router
进行了填充,只发现自述文件描述了路由器作为模块本身的理想用途:"在Backbone.js术语中,小部件由模型、视图、集合和路由器以及渲染小部件所需的任何模板组成。"
因此,我尝试了许多解决方案来实现可扩展路由系统(可扩展意味着模块可以指定自己的子例程),包括接受消息set-route
以设置路由的路由器模块,以及侦听route
消息的模块。我还为每个模块使用了一个子路由器。问题似乎是,在初始页面加载时,由于消息传递的"异步"性质,全局路由器解析URL时可能无法定义路由及其回调。你可以想象,在启动路由器模块之前,我可能需要对所有消息进行排队。
我想实现一些干净的东西,这是有意义的。我还考虑先解析所有小部件的所有路由,然后实例化路由器,这使得路由器模块成为一种特殊情况,因此不应该成为模块的一部分。
路由器应该是使用消息的模块,还是应该是一个扩展,或者是模块可以访问的全局架构的某个更高阶部分?
我知道这是一个很重的问题,提前感谢您的帮助!
关于这个问题有很多争论,我认为很多争论源于我认为路由器正式被称为控制器的困惑。当我去年年底开始使用Backbone时,已经做出了改变,但我相信很多人已经围绕路由器作为控制器构建了应用程序。我从来没有同意过。对我来说,路由器只是一个历史管理器组件,因为我早在创建Backbone之前就已经构建了一个类似于Backbone的专有MVC引擎。
因此,要解决您决定如何最好地实现路由器的特定问题,请考虑以下几点:
- 首先,路由器不是应用程序的必要组件。你可以不用路由器,仍然可以导航到应用程序的各个页面或屏幕
- 路由器不是控制器,因为它的主要功能是管理历史。虽然你可以在路由器中嵌入应用程序业务逻辑,但我一直发现这会混淆路由器的实际功能
- 通过将路由器作为应用程序的一个组件,您可以创建更好的关注点分离,并可以拥有更有效的pub/sub类型的排列
以下是我在应用程序中使用的路由器模块的代码,该模块遵循中介、pub/sub模式:
/**
* 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);
我发现最重要的一点是,它保持了代码的简洁性,并使我能够专注于控制器中的业务逻辑。
- Emberjs应用程序加载在除Index之外的所有路由上
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 什么'在Express中路由时,应用程序级中间件和路由器级中间件之间的区别是什么
- 使用Ampersand.js路由模块化应用程序
- 在通知点击时使用Ion中的OneSignal插件路由到应用程序中的状态
- 如何在不刷新父(应用程序)路由的情况下刷新当前路由
- 在Web应用程序中绑定API和模板路由的位置
- 在单页应用程序上进行客户端路由的正确方法是什么
- 无法在MEAN应用程序中路由到部分视图
- 使用中介pub/sub模式时路由骨干应用程序
- 如何在基于API的多页客户端应用程序中组织路由
- 具有来自静态json文件的路由的主干应用程序(只读)
- 多语言应用程序中的Angular JS路由不起作用
- Slick Carousel在应用程序动态路由的基础上不起作用
- 如何将angular js路由用于node js应用程序
- 如何使用路由提供程序在应用中调用模式服务
- 为什么我的 AngularJS 应用程序在添加路由时不起作用
- 路由在 Angular 和 nodejs 应用程序中不起作用
- Web API 应用程序中 asp.net 路由和路由前缀问题
- Angular Js 和 gapi 用于路由应用程序