通知承诺角度删除回调

时间:2015-01-21 11:11:00

标签: javascript angularjs q angular-promise

我想从服务通知多个控制器外部更改。 我知道我可以通过使用延迟对象并在其上调用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!");
    }) ;

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

2 个答案:

答案 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?