0

实际上,我需要每5 秒从一个控制器$http发出呼叫以获取数据。

我需要取消其他控制器中的间隔。

代码如下:-

控制器 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

请让我知道想法..帮助将不胜感激。

4

1 回答 1

3

您可以按照评论中提到的那样为此编写服务,或者使用事件$scope.$emit$scope.$broadcast.

这两者的区别。发射从孩子到$rootScope广播,例如从$rootScope所有孩子。

在开始按钮单击时,我发出一个带有间隔承诺的事件,另一个控制器可以绑定一个方法,$rootScope以便它检测到开始间隔。

然后可以使用随事件传递的承诺来完成停止。但是我们需要$broadcast在停止间隔后停止事件,以便StartController可以清除 promise 变量,否则停止后的另一个启动是不可能的。

请看下面的演示或在这个小提琴中。

2015 年 10 月 10 日更新

正如您在评论中提到的那样,您的用例与我编码的不同,并且通过更改为不同的控制器来停止间隔比事件内容更容易。

将您的计数器添加到“$rootScope”,即使在路线更改后也可以显示它。我认为否则该值将被您的控制器破坏。

然后将你的承诺传递给你的新状态,stateParams这样你就可以停止间隔。这也应该适用,ngRoute但应该用$routeParams.

如果间隔没有开始,我会隐藏停止按钮以避免代码检查是否有承诺。

ui.router你可以在这个fiddle中找到演示。

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>

于 2015-10-09T20:53:13.350 回答