2

我有一个 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, rootscope 不应该指的是MainCtrl?

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

4

1 回答 1

3

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

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

但这仍然不能帮助您通过 rootScope 访问此控制器的“对象”,因为 $scope 继承了 $rootScope,但反过来不行 - 所以无论您$scope$rootScope.

但是,您可以做的是将$scope.objects与工厂本身内部的变量链接起来,因此如下所示:

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直接覆盖,因为它会再次破坏引用。

于 2014-03-19T16:26:18.617 回答