На самом деле мне нужно $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
.
Пожалуйста, дайте мне знать Идеи.. Помощь будет очень оценена.
Вы можете написать сервис для этого, как указано в комментариях, или использовать события $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>
ngRoute
или ui.router
? Просто чтобы сделать демо для вашего роутера.
strtFinding
иstartFinding
есть только одна символьная разница, но один из них значительно легче читать. Удачи