【问题标题】:In angular, how to use cancel an $interval on user events, like page change?在 Angular 中,如何在用户事件上使用取消 $interval,例如页面更改?
【发布时间】:2014-01-26 14:18:53
【问题描述】:

Angular documentation 关于$interval 的意思是:

注意:此服务创建的间隔必须在您完成后明确销毁。

但它没有解释如何销毁 $interval。

例如,如果我有一个包含此代码的指令:

$interval(function() {
    for (var i in myArray) {
        // do domething
    }
}, 5000);

例如,当用户更改页面时,我如何销毁它?

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    每当用户更改页面时,与路由控制器关联的范围(下例中的/page1)将发送a $destroy event。你可以cancel $interval 在那个事件的监听器中:

    app.config(function ($routeProvider) {
         $routeProvider.when('/page1', {
              template: '<div>Page Content</div>',
              controller: PageController
          });
         // ...
    });
    
    function PageController($scope, $interval) {
        var intervalPromise = $interval(function () { /* ... */ }, 5000);      
        $scope.$on('$destroy', function () { $interval.cancel(intervalPromise); });
    }
    

    【讨论】:

    • 当范围更改为子范围时要取消/暂停 $interval 怎么办? $scope.$on('$destroy',...) 不会被调用。
    • @CaioOliveira 我不确定我理解您所说的“更改为子范围”是什么意思?您想在创建 any 子范围后立即取消 $interval 吗?如果是这样,我看不到用例。你想到了什么场景?
    • 我只是认为说“每当用户更改页面时”是错误的。可以在不破坏范围的情况下更改页面,例如创建子范围时。我有一个类似的场景:我需要父范围保持活动状态,但在更改到此子范围时必须暂停一段时间。当然,我可以在您创建子范围的地方暂停它,但我认为这是一种丑陋的处理方式(您可以忘记在某处暂停它)。我找不到解决方案。我对 Angular 很陌生,所以也许我正在做一些不符合它的哲学的事情。
    • @CaioOliveira,我遇到了一种情况,我会设置一个新的 $interval 在成功的$http 调用时获取新数据。 (保持数据新鲜)。但是如果$http 请求在$state 更改后被触发,那么计时器将被重新初始化,这“出现”就好像$interval 不是$destroy'ed。 Plnkr.co 上的示例:plnkr.co/edit/uPV6kQcIgELPoTAdc7BG?p=preview
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 2014-12-06
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多