【问题标题】:Notify promise angular remove callback通知承诺角度删除回调
【发布时间】:2015-01-21 11:10:59
【问题描述】:

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

例如

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

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

【问题讨论】:

    标签: javascript angularjs q angular-promise


    【解决方案1】:

    您可以使用$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 回答的cmets,您强调了一个重要方面:当您通过“为此侦听器返回注销函数”销毁控制器时,您需要注销$on。 (参见文档)$on 返回。有一个专门针对这个问题的问题:How can I unregister a broadcast event to rootscope in AngularJS?

    【讨论】:

      【解决方案2】:

      因更多问题详情而编辑

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

      这样创建$timeout...

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

      在控制器中添加:

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

      根据我的经验,这似乎可以清理所有内容。

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

      了解区别很重要!

      【讨论】:

      • 我只想从控制器中删除单个通知回调,因为它们可能有很多
      • 那么在这种情况下,我很想使用事件($broadcast、$emit 等),但要小心,因为您必须了解使用它们时的区别!
      • 控制器销毁时需要注销$on吗?
      • 我链接的指南应该解释一下,我认为您不需要太多,因为我认为它是自动的,但其他人可能更了解!
      • @user1168234 - 快速浏览了一下,如果范围在控制器中,那么 Angular 将为您取消注册。否则,您可以通过调用返回的函数来取消注册。 (即 var myevent = $scope.$on('someEvents', handleSomeEvent); myevent(); // 注销事件)
      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 2018-02-28
      • 2017-03-16
      • 2016-06-15
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多