跨多个角度模块共享数据,事件

时间:2016-02-20 21:14:23

标签: javascript angularjs

我正在开发一个使用多个模块的项目

我有一个内核模块和其他依赖于内核的模块

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();

引导

3 个答案:

答案 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);
  })

Cum grano salis

可以为每个模块重新实例化服务,这可能会妨碍您跨模块进行通信的能力。请事实核实我。与此同时,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}); 你完成了! ;)