我正在开发一个使用多个模块的项目
我有一个内核模块和其他依赖于内核的模块
angular.module('kernel', []);
...
angular.('process-manager', [ 'kernel', 'ui.router' ])
...
etc
我需要在所有模块之间共享一些数据,并在所有模块中广播一些事件。
目前在子模块中我使用$ rootScope作为$ window对象中定义为全局的内核模块
.factory('$appScope', appScope)
...
appScope.$inject = ['$window', '$rootScope'];
function appScope($window, $rootScope: ng.IRootScopeService) {
if (angular.isDefined($window.superScope) === false) {
$window.superScope = $rootScope;
}
return $window.superScope;
}
有没有更好的解决方案来做这样的事情?
修改 内核模块通过ng-app和其他模块引导,通过angular.bootstrap();
引导答案 0 :(得分:2)
我发现您在代码中使用.factory()...
,即使我不确定您是如何使用它的,但您可能正走在正确的道路上。
使用服务。服务是单例,用于保存可通过应用程序甚至跨模块注入共享的数据。对于广播事件,您可以在$broadcast
上致电$rootScope
,也可以在所有模块中对服务数据进行$watch
次更改。
对类似问题here有更好的答案。
以下是一个例子:
angular.module('firstModule', []).service('MyService', function () {
return {
some: 'data'
};
}).controller('someController', function ($scope, MyService) {
$scope.$watch(function () {
return MyService.some;
}, function (some) {
// This runs whenever the service's data changes
console.log(some.data, 'logged in first module');
}, true);
});
angular.module('secondModule', ['firstModule']) // <-- this makes the first module's service available for injection in the second module
.controller('someController', function ($scope, MyService) {
$scope.$watch(function () {
return MyService.some;
}, function (some) {
// This runs whenever the service's data changes
console.log(some.data, 'logged in second module');
}, true);
})
可以为每个模块重新实例化服务,这可能会妨碍您跨模块进行通信的能力。请事实核实我。与此同时,Dennis Nerush的答案中建议的本地存储可能是更好的方法。我发现https://github.com/gsklee/ngStorage是与Angular一起使用的良好补充。
答案 1 :(得分:1)
我建议使用本地存储在模块之间传递数据并保持数据一致。这是一个很好的例子
http://www.codediesel.com/javascript/sharing-messages-and-data-across-windows-using-localstorage/
答案 2 :(得分:0)
将所需模块中的事件列表器注册为'$ scope。$ on('changedVariable',function(event,args){//在listning模块中执行你的操作});'
在你需要braodast的模块中: $ scope。$ broadcast('changedVariable',{change:someValue}); 你完成了! ;)