使用服務共享控制器
你的情況之間的數據是試圖共享控制器之間的數據,而不是在控制器監控服務的價值,我覺得直接引用服務對象到控制器的範圍是一個更好的辦法
所以,你的觀點可以
<pre ng-controller="cntrl1">Value in cntrl1: {{ myService.value }} <button ng-click="update('value1')">Change to 'value1'</button></pre>
<pre ng-controller="cntrl2">Value in cntrl2: {{ myService.value }} <button ng-click="update('value2')">Change to 'value2'</button></pre>
,改變你的控制器
app.controller('cntrl1', function(myService, $scope) {
$scope.myService = myService;
$scope.update = function(str) {
$scope.myService.setValue(str);
}
});
app.controller('cntrl2', function(myService, $scope) {
$scope.myService = myService;
$scope.update = function(str) {
$scope.myService.setValue(str);
}
});
使用$ broadcast/$ emit
就像@squiroid指出的那樣,您可以使用$broadcast
向任何監控目標事件的控制器廣播事件。
請注意,在這裏,最好不要使用$rootScope.$broadcast + $scope.$on
,而應該使用$rootScope.$emit+ $rootScope.$on
作爲$broadcast
事件會通過所有後代作用域下降,這可能會導致嚴重的性能問題。
德哦 - 這麼簡單,但還是那麼好!謝啦。可以避免$ scope.update = function(){...}被重複,不知何故? –
關於envolving rootcope,這是可行的,謝謝你。訂閱服務不是一種「更清潔」的方式,而不是去根目錄做這些事情? –
而不是使用'$ scope.update = function()',你可以直接使用'ng-click =「myService.value ='value1'」'這很直接,避免了冗餘代碼。我個人更喜歡訂閱服務,而不是在rootScopes上進行廣播。 Angular服務是單例,可以作爲參考傳遞,所以簡單地將服務注入控制器是一種自然的JavaScript思維方式。 – Rebornix