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,因爲它會再次中斷參考。