2015-04-24 36 views
2

我正在決定控制器之間通信的正確方式。控制器之間的應用程序中發生了很多通信。我讀到,我可以使用$broadcast$emit$rootScope來做到這一點。但是,我想出了另一個使用承諾和服務通知控制器的想法。在使用服務和承諾的控制器之間進行通信

<html ng-app="testApp"> 
<head> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script> 
    <script> 
     angular.module('testApp', []) 
       .service('NotificationService', function ($q) { 
        var notificationDefer = $q.defer(); 

        this.whenDoSth = function() { 
         return notificationDefer.promise; 
        }; 

        this.notifyOthers = function (valueToPass) { 
         notificationDefer.notify(valueToPass); 
        }; 

        return this; 
       }) 
       .controller('PubController', function ($scope, NotificationService) { 
        $scope.doSthOnClickAndNotifyOthers = function() { 
         NotificationService.notifyOthers("valueToPass"); 
         // do sth else 
        }; 
       }) 
       .controller('SubController', function (NotificationService) { 
        NotificationService.whenDoSth().then(null, null, function(value) { 
         // do sth with the value 
        }) 
       }); 
    </script> 
</head> 
<body ng-controller="PubController as pubCtrl"> 
    <button ng-click="pubCtrl.doSthOnClickAndNotifyOthers()">Place Order</button> 
</body> 

你認爲這比使用$ rootScope一個更好的辦法?

+0

其中沒有任何內在錯誤。查看Facebook的Flux模式。 –

+0

也許這個問題在代碼審查部分會更好 –

回答

0

首先是的你是對的,使用服務被認爲是一種更好的方法,然後在$ rootScope上使用事件。使用$ rootScope並不被認爲是最佳實踐,因爲簡而言之,它與在JavaScript中使用窗口對象非常相似。因此,如果真的需要,每個與$ rootScope的直接交互都需要檢查。

要進一步瞭解您需要考慮您的應用程序想要做什麼以及爲什麼需要控制器之間的通信。如果您選擇一個好的架構,通常不需要這樣的溝通。如果您的兩個控制器基於相同的數據集,那麼您並不需要在AngularJS中進行手動通信。相反,您可以管理服務中的數據集,並且兩個控制器都可以使用此服務與數據進行交互。

如果您認爲$ broadcast或$ emit更適合您的用例,那麼這是一種有效的方法。但是你不需要在$ rootScope上使用這些方法。通常溝通只需要到達應用程序中的父母或子女元素。在這種情況下,您可以在單個控制器的$範圍內調用這些方法。 $ emit將等級中的事件向上傳遞給所有父母,$以相反的方式傳播給所有孩子。因此即使你想做事件發射,通常也不需要$ rootScope。

相關問題