Javascript AngularJS通过服务自动更新控制器数据

Javascript AngularJS通过服务自动更新控制器数据,javascript,angularjs,model-view-controller,angularjs-scope,Javascript,Angularjs,Model View Controller,Angularjs Scope,我现在有一些关于角度的基本问题。我刚刚编写了一个服务,它每隔五秒钟读取一个外部设备的温度。该服务将新的温度保存到变量中,并通过return语句将其公开。这看起来像这样(简化代码): 我使用控制器从服务中获取数据,如下所示: angular.controller("tempCtrl", ["$scope", "tempService", function ($scope, tempService) { $scope.temp = tempService.getTemp(); }]);

我现在有一些关于角度的基本问题。我刚刚编写了一个服务,它每隔五秒钟读取一个外部设备的温度。该服务将新的温度保存到变量中,并通过return语句将其公开。这看起来像这样(简化代码):

我使用控制器从服务中获取数据,如下所示:

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

    $scope.temp = tempService.getTemp();
}]);
<div ng-controller="tempCtrl">
        <p>{{temp}}</p>
</div>
在我看来,我是这样访问它的:

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

    $scope.temp = tempService.getTemp();
}]);
<div ng-controller="tempCtrl">
        <p>{{temp}}</p>
</div>

{{temp}}

但是我只得到了0,并且值永远不会改变。我已经尝试实现一个定制的发布/订阅模式,以便在新的温度下,我的服务触发一个事件,我的控制器正在等待更新作用域上的温度。这种方法工作得很好,但我不确定这是否是一种方式,因为angular带来了数据绑定,我认为这种简单的方法必须自己工作;)


非常感谢您的帮助。

我认为您应该在控制器ot中使用$interval

$interval(tempService.getTemp(), 5000);
请看这里


您正在从服务返回一个原语,如果您想更新一个primative,您需要对其进行重新技术处理。您应该返回一个对象,因为对象是通过引用传递的,所以您可以在控制器中获得实际值

在您的服务中执行此操作:

return m_temp;
在您的控制器中:

$scope.temp =  tempService;
服务更新后,您的视图将立即更新


这对您有帮助吗?

我以前试过,但缺点是如果我通过ng路由更改页面,控制器会被杀死。因此,每次我重新进入温度页面时,它都从一开始就开始,但是间隔应该每次都有效,即使是在后台。我只能通过将间隔逻辑放入服务中来实现这一点,这也是在后台运行的。ohkie,所以服务工作正常,您达到了最佳模式考虑?嗯,服务本身正在做它应该做的事情。但我不确定在控制器中使用这些参数时,向外界公开服务参数的最佳方式是什么。是的,这是一个关于最佳模式的问题,因为我在我的问题中使用的模式显然不起作用。返回一个对象而不是一个原语起了作用。谢谢只是确认一下,那么当服务更新时,控制器中的数据会更新吗?您完全传递服务,然后访问控制器或UI中的服务值或功能?您是否可以或您是否曾经执行过类似$scope.startTemp=tempService.startTemp的操作,然后在UI或控制器中调用该函数,例如$scope.startTemp(),而不是传递整个服务?谢谢,这非常有帮助,如果我可以接受多个答案,我将使用您的答案。但是sss提供了一个例子,这样我可以更容易地找出我的错误。