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循环中被多次调用,所以它应该非常简单。充其量只是一些干劲十足的人,没有太多的逻辑。