【问题标题】:Returning data from a service to a controller in Angular [duplicate]在Angular中将数据从服务返回到控制器[重复]
【发布时间】:2014-12-02 13:50:34
【问题描述】:

所以我正在编写一个简单的应用程序来返回每个州的人口普查数据。我有一个 $http 请求,它获取两个 JSON 文件并将它们组合起来。我在控制器中可以正常工作,但这似乎更适合我在服务中编写的内容,然后将服务中的数据注入控制器。但我不知道该怎么做。

这是我目前所拥有的:

app.js

app.factory('stateData', ['$http','$q', function($http, $q) {

  var combine;
  var states = $http.get('js/data/states.json');
  var rates = $http.get('http://api.census.gov/data/2013/acs1/profile?get=DP03_0128PE&for=state:*&key=b143975cec2fd367b0e0d73ba6417a6a47d097c7');

  combine = $q.all([states,rates]).then(function(result) {
    var combine = [];
    var states, rates;

    angular.forEach(result, function(response) {
      combine.push(response.data);
    });

    states = combine[0],
    rates = combine[1];

    for(var s = 0; s < states.length; s++) {
      for(var r = 0; r < rates.length; r++) {
        if(states[s].code === rates[r][1]) {
          states[s].rate = rates[r][0];
        }
      }
    }

    return states;
  });

  return combine;
}]);

app.controller('StatesCtrl', ['$scope','stateData', function($scope, stateData) {

  $scope.states = stateData;
}]);

如果我运行 console.log($scope.states) 我会回来:

Object {then: function, catch: function, finally: function} 

显然在返回之前从 $http 调用数据存在问题。

感谢大家提供的任何帮助。

【问题讨论】:

  • 是一个promise对象,需要链接stateData.then(function(states){ $scope.states = states });
  • 有数百个与此相关的帖子......只是将其中一个标记为重复......你可以查看这个答案,它涵盖了什么是 ajax 调用以及什么是异步和你如何处理从 ajax 调用返回的数据.. stackoverflow.com/questions/14220321/…
  • 只是添加 $scope.states = stateData; 用于在 Angular 1.2 版本之前自动解包承诺。它仅作为可选配置提供(不确定 1.3)。
  • 感谢您链接到重复的问题。对不起这个错误。当我四处寻找时,这个问题没有出现。只是一个礼仪问题:既然这个问题已被标记为重复,我该怎么做?

标签: javascript ajax json angularjs http


【解决方案1】:

服务返回一个promise,所以你需要调用.then并使用回调来设置$scope的值:

$scope.states = [];
stateData.then(function(data) {
    $scope.states = data;
});  

【讨论】:

  • 自然!谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多