我有一个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
的范围吗?
有使用事件的解决方法,但我不太热衷于此。我已经成功尝试了它,但我更喜欢一个解决方案,这只是有用的。
答案 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
,因为它会再次破坏参考。