AngularJS在工厂和工厂之间共享数据跨模块的控制器

时间:2014-03-19 16:18:37

标签: angularjs angularjs-scope angularjs-controller angularjs-factory

我有一个angularjs应用程序,有几个模块。主要模块看起来像:

var app = angular.module('mainMod', ['apiService']);
app.controller('MainCtrl', function (Socket) {
    $scope.objects = {};
    // do something with $scope.objects, etc.
});

然后我有;

var apiService = angular.module('apiService', ['ngResource']); // etc

apiService.factory('Socket', ['$rootScope', function ($rootScope) {
    // create a websocket and listen for stuff
    // if something happens, update 'objects' in $rootScope
}]);

问题是,我发现服务Socket已在MainCtrl中注入,但在Socket服务中,我无法访问$rootScope.objects。我确实理解工厂没有自己的范围,但是因为它被注入MainCtrl,根本不应该引用MainCtrl的范围吗?

有使用事件的解决方法,但我不太热衷于此。我已经成功尝试了它,但我更喜欢一个解决方案,这只是有用的。

1 个答案:

答案 0 :(得分:3)

您忘了将$scope注入控制器本身:

app.controller('MainCtrl', function ($scope, Socket) {
    $scope.objects = {};
   // do something with $scope.objects, etc.
});

但这仍然无法帮助您通过rootScope访问此控制器的“对象”,因为$ scope继承$ rootScope,但不是相反 - 所以无论您在$scope上定义什么传播到$rootScope

然而,您可以做的是将$scope.objects与工厂内部的varibale链接起来,如下所示:

var app = angular.module('mainMod', ['apiService']);
app.controller('MainCtrl', function (Socket) {
   $scope.objects = Socket.objects = {};
    // do something with $scope.objects, etc.
});

在你的Socket-Factory中:

apiService.factory('Socket', ['$rootScope', function ($rootScope) {
    return {
       objects : {}
   }
}]);

请注意不要直接覆盖$scope.objects,因为它会再次破坏参考。