2

我有一个有几个模块的angularjs应用程序。主要模块看起来类似: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 

and;

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

的事情是,我看到服务SocketMainCtrl被注入,但Socket服务中,我无法访问$rootScope.objects。我明白,工厂没有自己的范围,但自从它注入到MainCtrl之后,不应该将根视器指向范围MainCtrl

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

+0

将对象分配给$ rootScope的代码在哪里? –

+0

我的假设是,'MainCtrl'中的'$ scope'可以从Socket套接字引用(以某种方式)。很明显,使用'$ rootScope'会是错误的。所以为了改进这个问题,我想在'Socket'中替换'$ rootScope',以便引用'Socket'的作用域。 – Ashesh

回答

3

你忘了$scope注入到你的控制器本身:

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

但是,这仍然不需额外的帮助您通过rootScope访问该控制器的“对象”,因为$范围inherhits $ 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-厂:

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

只是要请小心不要直接覆盖$scope.objects,因为它会再次中断参考。