您可以按照评论中提到的那样为此编写服务,或者使用事件$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>