AngularJS:如何在一个服务中的多个函数中的三个情况下启动和停止$interval
作为一名新来者,我目前正在与AngularJS在Ionic和Cordova框架中开发跟踪与共享功能 在我的查看器中,我有几个按钮,其中两个应该启动和停止跟踪AngularJS:如何在一个服务中的多个函数中的三个情况下启动和停止$interval,angularjs,Angularjs,作为一名新来者,我目前正在与AngularJS在Ionic和Cordova框架中开发跟踪与共享功能 在我的查看器中,我有几个按钮,其中两个应该启动和停止跟踪 <button class="button button-block button-stable" ng-click="saveTakeOffTime()"> <i class="icon ion-ios-upload"></i> <strong>TAKE-OFF<
<button class="button button-block button-stable" ng-click="saveTakeOffTime()">
<i class="icon ion-ios-upload"></i> <strong>TAKE-OFF</strong>
<br ng-show="TakeOffTime" />
<span ng-show="TakeOffTime">{{TakeOffTime | date : 'HH:mm' : 'UTC'}} UTC | {{TakeOffTime | date : 'HH:mm' : 'GMT'}} GMT</span>
</button>
<br />
<button class="button button-block button-stable" ng-click="saveLandingTime()">
<i class="icon ion-ios-download"></i> <strong>LANDUNG</strong>
<br ng-show="LandingTime" />
<span ng-show="LandingTime">{{LandingTime | date : 'HH:mm' : 'UTC'}} UTC | {{LandingTime | date : 'HH:mm' : 'GMT'}} GMT</span>
</button>
我的问题:
我的控制器中有两个不同的功能,都可以访问上面的服务。我如何通过点击不同的按钮来启动、停止和重置计时器,并根据给定的“状态”调用不同的操作?
谢谢。多重跟踪$interval:
var tracker; // whenever you start a new tracker, store the reference to it. You can pass the reference to other area of the app, so they can cancel it
$scope.TAKEOFF = function TAKEOFF() { // use this instead of $scope for controllerAs
tracker = TrackingFunctions.doTracking();
};
$scope.LANDING = function TAKEOFF() { // use this instead of $scope for controllerAs
TrackingFunctions.doTracking(tracker);
};
function reset() {
TrackingFunctions.doTracking(tracker); // stop the previous
tracker = TrackingFunctions.doTracking(); // start new
};
.service('TrackingFunctions', ['$interval', function($interval) {
this.doTracking = function(execTracking){
if(!execTracking){ // if no tracker start new
return $interval(function(){
console.log("exec");
},2000);
} else { // if tracker cancel
$interval.cancel(execTracking);
}
};
}])
处理这个问题的一个简单方法是使用消息。您希望“与IntervalService交互”的每个按钮、小部件、操作、规则等都可以将消息广播到泵中,IntervalService可以注册这些消息并根据其内部规则进行操作。查看
$rootScope.broadcast
的文档,让您开始并随意摆弄这把小提琴(标题应该包含“Message Broker”,但我被自动更正诅咒了)。如果您确实使用消息传递路径,我建议您避免使用我在小提琴中实现的“收件人”方法。围绕操作的目的定义消息的类型。尽量不要将消息定义为“StartInterval”、“StopInterval”和“ResetInterval”。间隔中的微妙部分应该是IntervalService的实现细节,并且对与其交互的应用程序来说是不透明的。更好的方法是发布“起飞”和“着陆”消息。
var tracker; // whenever you start a new tracker, store the reference to it. You can pass the reference to other area of the app, so they can cancel it
$scope.TAKEOFF = function TAKEOFF() { // use this instead of $scope for controllerAs
tracker = TrackingFunctions.doTracking();
};
$scope.LANDING = function TAKEOFF() { // use this instead of $scope for controllerAs
TrackingFunctions.doTracking(tracker);
};
function reset() {
TrackingFunctions.doTracking(tracker); // stop the previous
tracker = TrackingFunctions.doTracking(); // start new
};
.service('TrackingFunctions', ['$interval', function($interval) {
this.doTracking = function(execTracking){
if(!execTracking){ // if no tracker start new
return $interval(function(){
console.log("exec");
},2000);
} else { // if tracker cancel
$interval.cancel(execTracking);
}
};
}])