通知承诺 angular 移除回调

Notify promise angular remove callback

我想通知多个控制器来自服务的外部更改。 我知道我可以通过使用延迟对象并在其上调用通知并在其上注册回调来做到这一点。

例如

// 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!");
    }) ;

有没有办法在控制器被销毁时删除我的通知回调?

根据进一步的问题详情进行编辑

您可以在销毁控制器时取消 $timeout:

这样创建 $timeout...

$scope.myTimeout = $timeout(function() {
                defered.notify('In progress')}
            , 0);

在控制器中添加:

$scope.$on('$destroy', function () {
    $timeout.cancel($scope.myTimeout);
});

根据我的经验,这似乎可以清理一切。

要仅清除通知回调本身,请使用建议的 $broadcast, $emit(请参阅@Pio 的回答)有关它们之间区别的指南是 here

了解其中的区别很重要!

您可以使用 $on, $broadcast and $emit 来实现类似的行为。

只需$broadcast(name, args);一个事件并注册一个侦听器$on(name, listener);

因此,当您获得数据时,您只需向所有人广播您已获得数据。

$broadcast('gotTheData', actualDataObject); 

然后在你的控制器中

 $on('gotTheData', function(event, actualDataObject)
     {
         ... update controller data ...
      });

请注意,在示例中我只添加了一个 actualDataObject,但您可以将多个参数从 $broadcast 传递到 $on。有关详细信息,请参阅文档(请参阅上面的 link)。

根据对@Scott 回答的评论,您强调了一个重要方面:当您通过 "Returns a deregistration function for this listener."(参见文档)销毁控制器时,您需要注销 $on [=16] =] returns。有一个问题专门针对这个问题:How can I unregister a broadcast event to rootscope in AngularJS?