来自Angular 文档:每个应用程序都有一个根范围。所有其他作用域都是根作用域的后代作用域。范围通过观察模型变化的机制提供模型和视图之间的分离。
当然,这将归结为意见和风格问题。我倾向于遵循非常接近John Papa 的 Angular Style Guide 的风格。
为了与这两者保持一致,并遵循良好的关注点分离策略,我的架构包含跨应用程序共享的工厂模型。反过来,我的控制器都绑定到保存共享数据的服务。
使用 $rootScope 作为全局事件总线正是 Angular 使用它的方式。你应该跟着做同样的事情吗?我不明白为什么不。但是,如果您是,请确保明确定义了目的,甚至可以使用您自己的服务将事件注册到全局事件总线。这样,您就可以将您的应用程序与 Angular 分离,如果您决定要更改全局事件总线所在的框架,那么您可以在一个地方进行更改。
这就是我的建议:
全局事件总线
// Angular specific: add service to module
angular.module('app').factory('globalEventBus', GlobalEventBus);
// Angular specific: inject dependencies
GlobalEventBus.$inject(['$rootScope']);
// Non framework specific.
// param: fameworkEventBus will be $rootScope once injected
function GlobalEventBus(fameworkEventBus) {
var globalEventBus = this;
globalEventBus.registerEvent(params...){
fameworkEventBus.
}
return globalEventBus;
}
全局数据模型
我的数据模型很智能,并且倾向于包含提供有关自身信息或检索/返回特定数据的功能。
// Angular specific: add service to module
angular.module('app').factory('dataModel', DataModel);
function DataModel() {
var dataModel= this;
dataModel.myData = {};
dataModel.GetSpecificData = funtion(param){
return ...
}
return dataModel;
}
控制器
// Angular specific
angular.module('app').controller('MyController', MyController);
// Angular specific: inject dependencies to controller
MyController.$inject = ['dataModel'];
// By convention I use the same parameter name as the service.
// It helps me see quickly if my order of injection is correct
function MyController(dataModel) {
var myController = this;
// Bind to the service itself, and NOT to the service data property
myController.myData = dataModel;
myController.doStuff = function(){
}
}
这是一篇关于绑定到服务而不是服务属性的有趣帖子。
总而言之,您必须判断什么对您最有效。良好的系统架构和良好的风格为我节省了无数时间来解决完全可以避免的问题。