我正在决定在控制器之间进行通信的正确方法。控制器之间的应用程序中发生了很多通信。我读到我可以$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更好吗?
答案 0 :(得分:0)
首先是的,你是对的,使用服务被认为是更好的方法,然后使用$ rootScope上的事件。使用$ rootScope并不是最佳实践,因为简而言之,它与在JavaScript中使用window对象非常相似。因此,如果确实需要,则需要检查与$ rootScope的每次直接交互。
要进一步了解,您需要考虑应用程序想要做什么以及为什么需要控制器之间的通信。如果选择一个好的架构,通常不需要这种通信。如果您的两个控制器基于相同的数据集,那么您不需要在AngularJS中进行手动通信。相反,您可以在服务中管理您的数据集,并且两个控制器都可以使用此服务与数据进行交互。
如果您得出的结论是$ broadcast或$ emit对于您的用例更好,那么这是一种有效的方法。但是您不需要在$ rootScope上使用这些方法。通常,通信只需要转移到应用程序中的父元素或子元素。在这种情况下,您可以在单个控制器的$ scope上调用这些方法。 $ emit将层次结构中的事件向上发送给所有父母,$以相反的方式向所有孩子广播。因此,即使您想要发生事件发射,通常也不需要$ rootScope。