我有一个控制器(称之为" A"),我从网络服务器获取一个值。当我得到这个值时,我将它存储在服务中。
在另一个控制器中(称之为" B")每次存储在服务中时,我都必须从服务中获取此值。此值必须出现在视图中(已更新)。
我通常的解决方案是: 我每次将值存储在服务中时都会发出一个事件。然后在控制器B中我听这个事件,然后我从服务中获得价值。
我知道还有其他解决方案,例如范围。$ watch / apply但我不知道哪个更好。
你能告诉我哪种方式更好吗?
答案 0 :(得分:1)
$rootScope.broadcast
的一个变化是使用RxJS Extensions for Angular构建服务:
<script src="//unpkg.com/angular/angular.js"></script>
<script src="//unpkg.com/rx/dist/rx.all.js"></script>
<script src="//unpkg.com/rx-angular/dist/rx.angular.js"></script>
var app = angular.module('myApp', ['rx']);
app.factory("DataService", function(rx) {
var subject = new rx.Subject();
var data = "Initial";
return {
set: function set(d){
data = d;
subject.onNext(d);
},
get: function get() {
return data;
},
subscribe: function (o) {
return subject.subscribe(o);
}
};
});
然后只需订阅更改。
app.controller('displayCtrl', function(DataService) {
var $ctrl = this;
$ctrl.data = DataService.get();
var subscription = DataService.subscribe(function onNext(d) {
$ctrl.data = d;
});
this.$onDestroy = function() {
subscription.dispose();
};
});
客户可以使用DataService.subscribe
订阅更改,生产者可以使用DataService.set
推送更改。
答案 1 :(得分:0)
$digest
或$apply
周期完成后,都会调用观察者。它对您的应用程序的影响比您正在进行的本地事件更具影响力。
如果您可以使用服务来控制指令和/或控制器之间的通信,那就更好了。
据我所知,有4种方法可以处理控制器和/或指令之间的通信:
$apply
$watch
周期
scope.$emit
或scope.$broadcast
)使用服务是最好的方法。特别是如果你处理&#34;一对一&#34;通信。