我在May应用程序上有不同的页面,它们都有自己的控制器。其中一个具有$ interval函数,比方说一个计时器。单击一个按钮将启动此间隔功能,该功能每秒更新一次。我想拥有的是,我希望能够转到应用程序中的任何其他页面(调用不同的控制器),但是我希望我的间隔能够继续运行,直到我从第一个控制器明确停止它为止。可以说是rootScope间隔。我该怎么做?
编辑:感谢克里斯和帕特里克,我现在有一个简单的服务,看起来像这样:
.service('TimerService', function($interval) {
var promise;
var timerSeconds = 0;
this.start = function () {
promise = $interval(function () {
timerSeconds++;
}, 1000);
};
this.stop = function () {
promise.cancel(interval);
timerSeconds = 0;
};
this.getTimer = function() {
return timerSeconds;
}
})
我还在此服务中存储了我的当前值(timerSeconds)。但是如何将该值同步到控制器?该服务使timerSeconds递增,并且在我的控制器开始时,我通过其getTimer()函数从该服务中读取了它,但显然不会在我的控制器上对其进行更新。如何将该服务属性与本地属性同步?
编辑:
当我将我的服务属性定义为一个对象,并将timerSeconds定义为该对象内部的数字时(似乎无法同步原语):
var timer = {seconds : 0};
this.getTimer = function() {
return timer;
}
并通过该获取器从我的控制器获取此对象:
vm.timer = TimerService.getTimer();
他们都是同步的。
最佳答案
不要麻烦将其添加到$ rootScope中。使用可在应用程序中任何位置使用的服务。这是一个可以启动和停止的单例计时器。在服务本身中定义intervalTimeout,或者如果您想变得真正灵活,请在提供程序中定义(对于此示例而言,可能会适得其反)。
angular.module('myApp', [])
.service('AppCallback', function ($interval) {
var states = states = {
PENDING: 0,
STARTED: 1
}, intervalTimeout = 3000, // Set this
interval;
this.states = states;
this.state = states.PENDING;
this.start = function (callback) {
if (this.state !== states.PENDING) {
return;
}
interval = $interval(callback, intervalTimeout);
this.state = states.STARTED;
}
this.stop = function () {
if (this.state !== states.STARTED) {
return;
}
$interval.cancel(interval);
this.state = states.PENDING;
};
})
.controller('MainController', function ($scope, AppCallback) {
var vm = {},
count = 0;
vm.toggle = function toggle() {
if (AppCallback.state === AppCallback.states.PENDING) {
AppCallback.start(function () {
vm.data = 'Ticked ' + (++count) + ' times.';
});
} else {
AppCallback.stop();
}
};
$scope.vm = vm;
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="MainController">
{{vm.data}}
<br />
<button ng-click="vm.toggle()">Toggle</button>
</div>
关于javascript - Angular $ interval独立于 Controller 运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33507770/