2015-02-05 60 views
1

我有一個簡單的問題:在兩個控制器之間進行交互(比如說)時,最好的('最乾淨','可伸縮')路徑應該是什麼。那會是定義一個服務並觀察該服務的返回值以作出反應嗎?AngularJs中的控制器之間的通信

我建立一個簡單的例子here,在那裏我看到了服務的當前值:

$scope.$watch(
    function() { 
     return myService.getValue(); 
    }, 
    function(newVal) { 
     $scope.value1 = newVal; 
    }); 

,當點擊一個按鈕更新服務的價值。

這可以做得更好,更小,更清潔嗎?這裏最好的做法是什麼?

乾杯。

回答

2

使用服務共享控制器

你的情況之間的數據是試圖共享控制器之間的數據,而不是在控制器監控服務的價值,我覺得直接引用服務對象到控制器的範圍是一個更好的辦法

所以,你的觀點可以

<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事件會通過所有後代作用域下降,這可能會導致嚴重的性能問題。

+0

德哦 - 這麼簡單,但還是那麼好!謝啦。可以避免$ scope.update = function(){...}被重複,不知何故? –

+0

關於envolving rootcope,這是可行的,謝謝你。訂閱服務不是一種「更清潔」的方式,而不是去根目錄做這些事情? –

+0

而不是使用'$ scope.update = function()',你可以直接使用'ng-click =「myService.value ='value1'」'這很直接,避免了冗餘代碼。我個人更喜歡訂閱服務,而不是在rootScopes上進行廣播。 Angular服務是單例,可以作爲參考傳遞,所以簡單地將服務注入控制器是一種自然的JavaScript思維方式。 – Rebornix

1

這是B通信的最佳方式/ W控制器通過服務隊共享相同的數據,但它是有限的B/W具有相同服務控制器: -

相反,你也可以選擇廣播被捕獲的事件其它控制器和更改數據因此這種方式更可擴展,但不乾淨:-)

Sender ctrl :- 
$rootScope.$broadcast('update', 'Some data'); //method that lets pretty much everything hear it even $scope too. 

$rootScope.$emit('update', 'Some data');// only lets other $rootScope listeners catch it 

聽Ctrl鍵: -

$rootScope.$on('update', function (event, data) { 
     console.log(data); // 'Some data' 
     }); 
+0

這個解決方案比較簡單,但是$廣播事件會遍歷所有的後代作用域,對嗎?$ emit可能會更好。 – Rebornix

+0

是的,如果你只聽rootScope.Ghanks :-)在性能發射的情況下會工作得更好。 – squiroid