从AngularJS中的服务刷新数据的最佳(惯用)方法

时间:2013-07-26 13:26:40

标签: angularjs angularjs-scope angularjs-service

我正面临着AngularJS,服务和范围的“问题”。

这不是一个真正的问题(我发现有几种方法可以让它发挥作用),但我想知道我是做正确的事情,还是我正在做的事情会导致将来出现问题< / p>

我有一个包含一些全球数据的服务;该服务有两种方法: 的getData() refreshData()

refreshData触发一些工作(休息调用等),并在不同控制器内的精确点调用它,以响应用户操作(按钮点击等)。

getData(显然)被调用以获取数据。

在控制器中,我应该如何使用它来访问数据并将其放在范围内,以便可以从视图中访问它?

备选方案1:

controller('MyController', function ($scope, myService) {   
     $scope.data = myService.getData();
     //use data in functions and in the view, ex: ng-hide="data.forbidden"

备选方案2:

controller('MyController', function ($scope, myService) {   
     $scope.data = function() { return myService.getData(); }
     //use data() in functions and in the view, ex: ng-hide="data().forbidden"

备选方案3:

controller('MyController', function ($scope, myService) {   
     $scope.forbidden = function() { return myService.getData().forbidden; }
     //... one function for each data.member used in this view
     //usage in the view: ng-hide="forbidden()"

备选方案4:使用$ apply或$ watch

我目前正在使用第二种方法,因为它甚至在未创建新控制器时也能工作(考虑同一页面中不同控件的不同部分)。

它有意义吗?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

这取决于用法。当您要在加载页面或初始化控制器时填充数据时,可以使用备选方案1或3。如果要通过单击按钮或其他操作来触发数据刷新,可以使用备选方案2。当您希望数据加载由其他数据模型上的数据更改驱动时,可以使用备选方案4。因此,我认为您发布的每个替代方案都适用于正确的方案。