AngularJS服务更新控制器变量
我有一个像这样的角度服务-AngularJS服务更新控制器变量,angularjs,Angularjs,我有一个像这样的角度服务- function updateViewService($http, $interval) { var change = true; var grabTimeStamp = function(){ $http.get('someapi').then(function success(response){ //some logic to change var change according to the response } $interval(
function updateViewService($http, $interval) {
var change = true;
var grabTimeStamp = function(){
$http.get('someapi').then(function success(response){
//some logic to change var change according to the response
}
$interval(grabTimeStamp, 10000);
return { refresh: function(){
return change;
}};
}
现在我需要做的是返回控制器中的change
,并在服务change
发生更改时更新控制器变量
我怀疑的是,在控制器中,服务返回函数只返回一次值。因此,我在调用服务时在控制器中尝试了$interval
,但也没有更新控制器变量
我有很多控制器,这就是为什么我做了一个应该更新所有控制器的服务
然后我尝试了$rootScope.$broadcast
,只要变量发生变化。尝试在控制器上使用$scope.$收听广播,但未起作用
if(change === true){
$rootScope.$broadcast('dataChanged',change);
change = false;
}
理想的方法应该是什么
基本上我想做的是-
创建一个每10秒发出一次请求的服务,并更新change
变量(完成)
将此变量传递给控制器并更新视图(基本上是向后端发出请求并获取新数据{stack})
谢谢。那么您想知道服务中的更改变量何时更改值
您可以为此使用$scope.$watch
angular.module('app',[]);
角度。模块('app')。服务('someService',函数($interval,$q){
var变化=0;
$interval(函数(){
$q.resolve(Math.random())//一些承诺,可能来自$http,但为了简单起见,我将使用$q.resolve
.然后(函数(结果){
change=result;//将更改设置为随机值
});
},1000);//每秒更改一次
返回{
getChange:function(){
回报变化;
}
};
});
角度.module('app').controller('Example',function($scope,someService){
$scope.$watch(someService.getChange,函数(change){///在someService.getChange上添加观察程序,当change更改值时将触发
this.change=change;//将更改设置为控制器在这里可以放置一些额外的逻辑
}.约束(这个);
});代码>
{{Ex.change}}
您可以做的是创建一个简单的轮询服务。它将以指定的时间间隔发出请求。以下是我的做法:
function updateViewService($http, $timeout) {
var grabTimeStamp = function(callback) {
return $http.get('someapi').then(function success(response) {
//some logic to change var change according to the response
return response.data;
});
}
var poll = function(action, interval) {
return $timeout(function() {
grabTimeStamp()
.then(action)
.then(poll.bind(null, action, interval))
}, interval);
};
return {
grabTimeStamp: grabTimeStamp,
poll: poll
}
}
app.factory('dataService', updateViewService);
然后在控制器中使用它,如下所示:
dataService.poll(function(data) {
$scope.data.push(data);
}, 1000);
演示:您为事件提供的解决方案应该可以工作,但必须在控制器中注入服务。事实上,服务必须在控制器之前由Angular实例化
.service(function updateViewService($http, $interval, someService) {
var change = true;
var grabTimeStamp = function(){
$http.get('someapi').then(function success(response){
//some logic to change var change according to the response
if(change === true){
$rootScope.$broadcast('dataChanged',change);
change = false;
}
}
$interval(grabTimeStamp, 10000);
})
.controller(function($rootScope, updateViewService){
$rootScope.$on('dataChanged', function(){
//do something
});
})
触发事件时会出现什么错误?没有错误iIRC$scope。$watch将表达式字符串作为第一个参数,并且表达式应该是$scope的属性,奇怪的是这是否有效?@HarryLim it可以使用字符串,但函数也被接受。是的,它是有效的,每当这个函数的结果改变时,它都会被触发。Ofc这个函数在$digest循环中被多次调用,所以它应该非常简单。充其量只是一些干劲十足的人,没有太多的逻辑。