1

我现在有一些基本的角度问题。我只写了一个服务,以5秒为间隔读取外部设备的温度。该服务将新温度保存到变量中并通过返回语句公开。这看起来有点这个(简化代码):AngularJS通过服务自动更新控制器数据

angular.service("tempService", ["$interval", function ($interval) { 

    //revealing module pattern 
    var m_temp = 0, 
     requestTemp = function() {//some logic here}, 
     onResponseTemp = function (temp) { 
      m_temp = temp;  
     }, 
     //some other private functions and vars ... 
     foo = bar; 

    //request new temperture every 5s, calls onResponseTemp after new data got received 
    $interval(requestTemp, 5000); 

    return { 
     getTemp = function(){return m_temp;} 
    } 
}]); 

我使用一个控制器从这样的服务获取数据:

angular.controller("tempCtrl", ["$scope", "tempService", function ($scope, tempService) { 

    $scope.temp = tempService.getTemp(); 
}]); 

在我看来,我访问这样的:

<div ng-controller="tempCtrl"> 
     <p>{{temp}}</p> 
</div> 

但我只得到0,并且值永不改变。我试图实现一个自定义的Pub/Sub模式,以便在新的温度下,我的服务会触发一个事件,我的控制器正在等待更新示波器温度。这种方法工作得很好,但我不确定这是否是角度带来数据绑定的方式,我认为这种简单的方法必须自行工作;)

帮助真的很感激。

回答

1

请看这里http://jsbin.com/wesucefofuyo/1/edit

var app = angular.module('app',[]); 

    app.service("tempService", ["$interval", function ($interval) { 

     //revealing module pattern 
     var m_temp = { 
     temp:0, 
     time:null 

     }; 


      var requestTemp = function() { 
      m_temp.temp++; 
      m_temp.time = new Date(); 

      }; 

      var startTemp = function() { 
     $interval(requestTemp, 3000); 
      }; 
     return { 
      startTemp :startTemp, 
      m_temp:m_temp 
     }; 
    }]); 

    app.controller('fCtrl', function($scope,tempService){ 

     $scope.temp = tempService; 
     $scope.temp.startTemp(); 


    }); 
+0

返回一个对象而不是一个原始的技巧。谢谢! – Fidel90 2014-10-02 10:19:05

+0

只是为了确认,当服务更新时,控制器中的数据会完全更新,然后您访问控制器或UI中的服务值或功能?你可以或你会做$ scope.startTemp = tempService.startTemp,然后调用UI或控制器调用函数,如$ scope.startTemp()而不是传递整个服务? – mtpultz 2014-10-09 05:17:16

0

我认为你应该使用$间隔控制的OT服务

$interval(tempService.getTemp(), 5000); 
+0

我曾尝试过,但不利的一面是,如果我通过ng-route更改页面,控制器就会死亡。所以每次我重新进入从一开始就开始的温度页面,但时间间隔应该每次都工作,即使在后台。我只能通过将间隔逻辑放入服务中来实现此目的,该服务也在后台运行。 – Fidel90 2014-10-02 08:52:18

+0

ohkie,所以服务的事情工作正常,你是最好的模式考虑? – 2014-10-02 08:54:08

+0

那么,服务本身正在做它应该做的。但我不确定将服务参数暴露给外部以便在控制器中使用它们的最佳方式是什么。所以是的,这是最好的模式问题,因为我在我的问题中使用的模式显然不起作用。 – Fidel90 2014-10-02 08:58:18

1

你是从你的服务返回一个原始的,如果你想更新的灵长类动物你需要重新设计它。你应该返回一个对象,因为on对象是通过引用传递的,所以你得到了控制器中的实际值。

做到这一点在你的服务:

return m_temp; 

这在你的控制器:

$scope.temp = tempService; 

,你的看法会尽快的服务得到更新升级。

这对你有帮助吗?

+0

谢谢,这对我有很大的帮助,如果我能接受的不仅仅是一个答案,我会和你一起回答。但是sss提供了一个例子,所以我可以更容易地找出我的错误。 – Fidel90 2014-10-02 10:20:53

相关问题