我想通知多个控制器来自服务的外部更改。我知道我可以通过使用延迟对象并在其上调用通知并在其上注册回调来做到这一点。
例如
// 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!");
}) ;
有没有办法在控制器被销毁时删除我的通知回调?
$on、$broadcast和$emit来实现类似的行为。
只需$broadcast(name, args);
一个事件并注册一个侦听器$on(name, listener);
。
因此,当你得到你的数据时,你只是向所有人广播你已经拥有它。
$broadcast('gotTheData', actualDataObject);
然后在您的控制器中
$on('gotTheData', function(event, actualDataObject)
{
... update controller data ...
});
请注意,在示例中,我只添加了一个actualDataObject
,但是您可以将多个参数从$broadcast
传递到$on
。有关更多详细信息,请参阅文档(请参阅上面的链接)。
根据对@Scott回答的评论,您强调了一个重要方面:当您通过"返回此侦听器的取消注册函数"销毁控制器时,您需要注销$on
。(见文档)在$on
返回。有一个问题专门针对这个问题:如何在 AngularJS 中取消将广播事件注册到 rootscope?。
由于进一步的问题详细信息而进行编辑
您可以在销毁控制器时取消$timeout:
创建$timeout
,如下所示...
$scope.myTimeout = $timeout(function() {
defered.notify('In progress')}
, 0);
在控制器中添加以下内容:
$scope.$on('$destroy', function () {
$timeout.cancel($scope.myTimeout);
});
根据我的经验,这似乎可以清理一切。
要仅清除通知回调本身,请使用建议的$broadcast, $emit
(请参阅@Pio的答案) 它们之间区别的指南在这里。
了解区别很重要!