Как отменить метод $ interval без ng-click?

0

На самом деле мне нужно $http вызов $http чтобы получить данные за каждые 5 секунд от одного контроллера.

Мне нужно отменить интервал в другом контроллере.

Код: -

Контроллер 1 (Найти все события): -

function($interval,$timeout) {

        $rootScope.strtFinding=true;

         var FireItUpAndFindEvents=$interval(function(){
           console.log('$rootScope.strtFinding'+$rootScope.strtFinding);
         },5000);


        if($rootScope.strtFinding === false){ 
           console.log('$rootScope.strtFinding'+$rootScope.strtFinding);
            $scope.stop();
        };

        $scope.stop=function(){
            console.log('Called the Finding event');
            $interval.cancel(FireItUpAndFindOrders);
        };

Контроллер 2: -

 $rootscope.strtFinding=false;

Здесь я сталкиваюсь с проблемой отменить $interval от другого контроллера путем обновления $rootScope.

Пожалуйста, дайте мне знать Идеи.. Помощь будет очень оценена.

  • 1
    Создайте функцию в службе, чтобы установить таймер и внедрить службу в оба контроллера. Я думаю, что есть также способ внедрить контроллеры друг в друга, но я никогда не делал этого. Кроме того, между strtFinding и startFinding есть только одна символьная разница, но один из них значительно легче читать. Удачи
Теги:
angularjs-rootscope

1 ответ

3

Вы можете написать сервис для этого, как указано в комментариях, или использовать события $scope.$emit или $scope.$broadcast.

Разница между этими двумя. Испускание идет от childs до $rootScope и вещание идет вниз, например, от $rootScope до всех детей.

При нажатии кнопки " $rootScope событие с интервальным обещанием, а другой контроллер может привязать метод на $rootScope чтобы он обнаружил начало интервала.

Затем остановку можно выполнить с обещанием, переданным с событием. Но нам нужно $broadcast события остановки после остановки интервала, чтобы StartController мог очистить переменную обещания, иначе другой запуск после остановки был бы невозможным.

Пожалуйста, ознакомьтесь с демонстрацией ниже или в этой скрипке.

Обновление 10.10.2015

Как вы упомянули в комментариях, ваш прецедент отличается от того, что я закодировал, и остановка интервала с изменением на другой контроллер проще, чем материал события.

Добавьте свой счетчик в $ rootScope, чтобы он отображался даже после изменения маршрута. Я думаю, что в противном случае значение будет уничтожено вашим контроллером.

Затем передайте свое обещание новому состоянию как stateParams чтобы остановить интервал. Это также должно работать для ngRoute но тогда это должно быть сделано с помощью $routeParams.

Я скрываю кнопку остановки, если интервал не запущен, чтобы избежать кода, чтобы проверить, есть ли обещание.

Вы можете найти демо с ui.router в этой скрипке.

angular.module('demoApp', [])
	.controller('TimerController', TimerController)
	.controller('StopController', StopController);

function TimerController($scope, $interval) {
    var self = this,
        intPromise;
    
    $scope.$on('timerEvent:stopped', function() {
    	intPromise = null; // timer stopped in other controller
    });
    
	this.start = function() {
        if (!intPromise) {
    		intPromise = $interval(update, 1000);
        	$scope.$emit('timerEvent:start', intPromise);
        }
    }
    
    function update() {
    	self.value = Math.round(Math.random()*100, 0);
    }     
}

function StopController($rootScope, $interval) {
	var self = this;
    
    $rootScope.$on('timerEvent:start', function(evt, promise) {
        console.log(promise);
    	self.timerPromise = promise;
    });
    
    this.stop = function() {
        console.log('stoppin', self.timerPromise);
        if ( self.timerPromise ) {
    		$interval.cancel(self.timerPromise);
            $rootScope.$broadcast('timerEvent:stopped');
        }
    };
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="demoApp">
    <div ng-controller="TimerController as timerCtrl">
        <button ng-click="timerCtrl.start()">start</button>
        {{timerCtrl.value}}
    </div>
    
    <div ng-controller="StopController as stopCtrl">
        <button ng-click="stopCtrl.stop()">stop</button>
    </div>
  • 0
    @ AWOLF Я видел твою скрипку, которая хороша с нг-кликами. Но самое сложное, что мне нужно, - это остановить таймер без нажатия нг. Мне нужно отменить таймер Когда я сменил ctrl 1 на другой контроллер SO Rootscope Воспроизведение трюка. Не могли бы вы изменить код в отношении этого сценария Плз.
  • 0
    Ах, хорошо, это тоже возможно. Какой роутер вы используете? ngRoute или ui.router ? Просто чтобы сделать демо для вашего роутера.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню