Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
Javascript 具有独立于控制器运行的角度间隔_Javascript_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Javascript 具有独立于控制器运行的角度间隔

Javascript 具有独立于控制器运行的角度间隔,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,我在五月的应用程序上有不同的页面,它们有自己的控制器。其中一个有$interval函数,比如计时器。单击按钮将启动此间隔函数,该函数每秒更新一次。我想要的是,我希望能够转到我的应用程序中的任何其他页面(调用不同的控制器),但是我希望我的间隔继续运行,直到我从第一个控制器显式停止它。可以说是根示波器间隔。我怎么做 编辑:多亏了Chris和Patrick,我现在有了一个简单的服务,如下所示: .service('TimerService', function($interval) { v

我在五月的应用程序上有不同的页面,它们有自己的控制器。其中一个有$interval函数,比如计时器。单击按钮将启动此间隔函数,该函数每秒更新一次。我想要的是,我希望能够转到我的应用程序中的任何其他页面(调用不同的控制器),但是我希望我的间隔继续运行,直到我从第一个控制器显式停止它。可以说是根示波器间隔。我怎么做

编辑:多亏了Chris和Patrick,我现在有了一个简单的服务,如下所示:

  .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定义为该对象内的数字时(似乎无法同步基本体):

并通过该getter从我的控制器获取此对象:

vm.timer = TimerService.getTimer();

它们都是同步的。

如果您想在控制器之间共享任何数据,正确的方法是使用服务

然后,我将创建一个服务,允许您停止并启动此计时器/间隔


初始控制器将启动此功能,并将一直“滴答”直到停止。

如果要在控制器之间共享任何数据,正确的方法是使用服务

然后,我将创建一个服务,允许您停止并启动此计时器/间隔


初始控制器将启动此操作,并且它将一直“滴答”直到停止。

不要麻烦将其添加到$rootScope。使用可在应用程序中任何位置使用的服务。这是一个可以启动和停止的单态计时器。在服务本身中定义intervalTimeout,或者如果您想真正灵活,可以在提供程序中定义intervalTimeout(在本例中可能是过度使用)

angular.module('myApp',[])
.service('AppCallback',函数($interval){
变量状态=状态={
待定:0,
开始:1
},intervalTimeout=3000,//设置此
间隔
this.states=状态;
this.state=states.PENDING;
this.start=函数(回调){
if(this.state!==states.PENDING){
回来
}
interval=$interval(回调,intervalTimeout);
this.state=states.STARTED;
}
this.stop=函数(){
if(this.state!==states.STARTED){
回来
}
$interval.cancel(interval);
this.state=states.PENDING;
};
})
.controller('MainController',函数($scope,AppCallback){
var vm={},
计数=0;
vm.toggle=函数toggle(){
if(AppCallback.state==AppCallback.states.PENDING){
AppCallback.start(函数(){
vm.data='ticketd'+(++count)+'times';
});
}否则{
AppCallback.stop();
}
};
$scope.vm=vm;
});

{{vm.data}

切换
不用麻烦将其添加到$rootScope。使用可在应用程序中任何位置使用的服务。这是一个可以启动和停止的单态计时器。在服务本身中定义intervalTimeout,或者如果您想真正灵活,可以在提供程序中定义intervalTimeout(在本例中可能是过度使用)

angular.module('myApp',[])
.service('AppCallback',函数($interval){
变量状态=状态={
待定:0,
开始:1
},intervalTimeout=3000,//设置此
间隔
this.states=状态;
this.state=states.PENDING;
this.start=函数(回调){
if(this.state!==states.PENDING){
回来
}
interval=$interval(回调,intervalTimeout);
this.state=states.STARTED;
}
this.stop=函数(){
if(this.state!==states.STARTED){
回来
}
$interval.cancel(interval);
this.state=states.PENDING;
};
})
.controller('MainController',函数($scope,AppCallback){
var vm={},
计数=0;
vm.toggle=函数toggle(){
if(AppCallback.state==AppCallback.states.PENDING){
AppCallback.start(函数(){
vm.data='ticketd'+(++count)+'times';
});
}否则{
AppCallback.stop();
}
};
$scope.vm=vm;
});

{{vm.data}

切换
我是否应该在rootScope中保留我的计时器对象(始终以间隔递增的数字)?使用工厂来存储该数字。是的,正如@Rorschach120所建议的,将其放在您的服务/工厂中,因为这是您希望在控制器之间共享的一些信息,我是否应该保留我的计时器对象(始终按间隔递增的数字)在rootScope中?使用工厂存储该号码。是的,正如@Rorschach120所建议的,将该号码放在您的服务/工厂中,因为这是一些您希望在控制器之间共享的信息。因此服务正在运行更新控制器中的此数据对象,但如果您更改控制器并再次调用它,会发生什么情况?您的数据和计数对象将我可能会丢失,因为它们是在你的控制器中定义的..或者我错过了什么?我已经尝试将数据对象添加到rootScope并从那里读取它。这是可行的,但总是同步vm和rootScope并不太好。你有任何其他建议吗?所以服务正在运行,更新你控制器中的此数据对象,但是如果您更改了控制器并再次调用它?您的数据和计数对象将丢失,因为它们在您的控制器中定义了..或者我是否遗漏了某个内容?我已尝试将数据对象添加到rootScope并从那里读取它。这有点奇怪
vm.timer = TimerService.getTimer();