【问题标题】:Stop an interval of a controller on navigating to another site在导航到另一个站点时停止控制器的间隔
【发布时间】:2018-02-26 13:25:48
【问题描述】:

在我的应用程序中,我不断更新显示的数据,这些数据使用间隔在服务器上更改,该间隔在控制器加载时加载。当我导航到特定站点时,控制器会在时间间隔内与函数一起加载,并且我希望它在我导航到另一个站点时停止。问题是,在使用该网站一段时间后,我最终会运行一堆间隔,而且看起来很讨厌。这是控制器的代码:

angular
.module('myApp')
.controller('TaxiesController', ['$scope', '$location', '$routeParams', '$route', 'dataFactory', '$interval', function ($scope, $location, $routeParams, $route, dataFactory, $interval) {
    console.log('TaxiesController loaded')
    var cancel = {
        name: 'Preklic',
        price: 500
    }
    $scope.taxies = [];
    $scope.taxi = {};
    $scope.taxi.history = [];
    taxi = {}
    taxi.history = [];

    $scope.getTaxies = () => {
        dataFactory.getTaxies().then(function (response) {
            $scope.taxies = response.data;
        });
    }

    $scope.getTaxi = () => {
        var id = $routeParams.id;
        dataFactory.getTaxi(id).then(function (response) {
            $scope.taxi = response.data;
        });
    }

    $scope.removeTaxi = (id) => {
        dataFactory.removeTaxi(id).then(function (response) {});
    }

    $scope.getTotal = (taxi) => {
        var total = 0;
        for (var i = 0; i < taxi.history.length; i++) {
            var rent = taxi.history[i];
            if (rent.price) total += rent.price;
        }
        return total;
    }

    $scope.disableTaxi = (taxi, id) => {
        taxi.drivable = false;
        dataFactory.updateTaxi(id, taxi).then(function (response) {
            $scope.taxi = response.data;
            $route.reload();
        })
    }

    $scope.cancelTaxi = (taxi, id) => {
        console.log('cancelling..')
        taxi.available = true;
        taxi.history.unshift(cancel);
        dataFactory.updateTaxi(id, taxi).then(function (response) {});
    }

    var updateTaxies = () => {
        console.log('Checking rent length')
        dataFactory.getTaxies().then(function (response) {
            $scope.taxies = response.data;
        });
    }

    $interval(updateTaxies, 2000);
}]);

【问题讨论】:

  • $scope.onDestroy(() => {$interval.cancel(yourInterval)})
  • 我在哪里添加这个?什么是 onDestroy 函数?
  • 一般你不需要做这样的事情。 问题是,在使用该网站一段时间后,我最终会运行一堆间隔,而且看起来很糟糕 - 如果这是另一个网站,怎么可能? (考虑到它是在同一个窗口中打开的)。

标签: angularjs intervals angularjs-controller


【解决方案1】:

只需在控制器中添加这个:

var intervalListener = $interval(updateTaxies, 2000);
$scope.$on('$destroy', function() {
    $interval.cancel(intervalListener);
});

$destroy 是一个在作用域被销毁时触发的事件。这是关于它的doc

【讨论】:

  • 嗯,间隔并没有停止,显然是因为当我切换站点时,所有站点都使用相同的控制器。我是否必须将不同站点的控制器分开才能使其正常工作?
  • 我不确定那个销毁事件是在导航时触发的。
  • 通常您为每个视图使用不同的控制器,如果您需要在控制器内进行通信,则使用服务。如果您只使用一个控制器,我会使用工厂来设置可以取消的间隔并从路由器开始。或者您可以观察路线变化
  • @Vid 似乎您不知道“站点”是什么意思——即使您导航到另一个页面(或/和另一个站点),所有 js 对象都被完全销毁。这不同于从浏览器的角度来看不是导航的角度导航(即 site.com/books -> site.com/library)。
  • 那是什么?只是更改视图中的模板?
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多