使用服务和承诺在控制器之间进行通信

时间:2015-04-24 10:31:53

标签: javascript angularjs angular-promise

我正在决定在控制器之间进行通信的正确方法。控制器之间的应用程序中发生了很多通信。我读到我可以$broadcast使用$emit$rootScope来执行此操作。但是,我提出了使用promises和服务来通知控制器的另一个想法。

<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更好吗?

1 个答案:

答案 0 :(得分:0)

首先是的,你是对的,使用服务被认为是更好的方法,然后使用$ rootScope上的事件。使用$ rootScope并不是最佳实践,因为简而言之,它与在JavaScript中使用window对象非常相似。因此,如果确实需要,则需要检查与$ rootScope的每次直接交互。

要进一步了解,您需要考虑应用程序想要做什么以及为什么需要控制器之间的通信。如果选择一个好的架构,通常不需要这种通信。如果您的两个控制器基于相同的数据集,那么您不需要在AngularJS中进行手动通信。相反,您可以在服务中管理您的数据集,并且两个控制器都可以使用此服务与数据进行交互。

如果您得出的结论是$ broadcast或$ emit对于您的用例更好,那么这是一种有效的方法。但是您不需要在$ rootScope上使用这些方法。通常,通信只需要转移到应用程序中的父元素或子元素。在这种情况下,您可以在单个控制器的$ scope上调用这些方法。 $ emit将层次结构中的事件向上发送给所有父母,$以相反的方式向所有孩子广播。因此,即使您想要发生事件发射,通常也不需要$ rootScope。