我想从服务通知多个控制器外部更改。 我知道我可以通过使用延迟对象并在其上调用notify并在其上注册回调来实现此目的。
e.g
// in service
$timeout(function() {
defered.notify('In progress')}
, 0)
//in controller
var promise = myService.promise
promise.then(function(success) {
console.log("success");
}, function(error) {
console.log("error");
}, function(update) {
console.log("got an update!");
}) ;
当控制器被销毁时,有没有办法删除我的通知回调?
答案 0 :(得分:3)
编辑更多问题详情
你可以在销毁控制器时取消$ timeout:
创建$timeout
,因为......
$scope.myTimeout = $timeout(function() {
defered.notify('In progress')}
, 0);
在控制器中添加:
$scope.$on('$destroy', function () {
$timeout.cancel($scope.myTimeout);
});
根据我的经验,这似乎可以清理一切。
要清除通知回调本身,请使用建议的$broadcast, $emit
(请参阅@ Pio的回答)它们之间的差异指南是here。
了解差异非常重要!
答案 1 :(得分:3)
您可以使用$on, $broadcast and $emit来实现类似的行为。
只需$broadcast(name, args);
一个事件并注册一个监听器$on(name, listener);
。
因此,当您获得数据时,您只需向所有人广播您已获得的数据。
$broadcast('gotTheData', actualDataObject);
然后在您的控制器中
$on('gotTheData', function(event, actualDataObject)
{
... update controller data ...
});
请注意,在示例中,我只添加了一个actualDataObject
,但您可以将多个参数从$broadcast
传递到$on
。有关更多详细信息,请参阅文档(请参阅上面的链接)。
根据对@ Scott的回答,您强调了一个重要方面:当您通过"销毁控制器时,需要取消注册$on
。返回此侦听器的注销功能。 " (请参阅文档)$on
返回。有一个问题专门针对此问题:How can I unregister a broadcast event to rootscope in AngularJS?。