Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS:如何在一个服务中的多个函数中的三个情况下启动和停止$interval_Angularjs - Fatal编程技术网

AngularJS:如何在一个服务中的多个函数中的三个情况下启动和停止$interval

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<

作为一名新来者,我目前正在与AngularJS在Ionic和Cordova框架中开发跟踪与共享功能

在我的查看器中,我有几个按钮,其中两个应该启动和停止跟踪

<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);
            }
        };
}])