无法获得$ http响应数据到控制器

时间:2016-01-07 07:36:39

标签: angularjs json

我有一个使用angular返回JSON对象的工厂。 $ http.get请求正在获取数据,因为我可以在console.log(data)中看到它。我也知道如果我将JSON对象硬编码到工厂中,控制器会接收数据并在视图中正确显示

我的问题是为什么override func touchesBegin(touches:NSSet, withEvent event: UIEvent) { let reveal = SKTransition.flipHorizontalWithDuration(1.0) // the number is the duration time. After you type . right behind SKTransition, you can choose other scene transition effect. self.view?presentScene(NewGameScene,transition:reveal) } 没有归还 数据到我的控制器,即使$ http.get得到它?

<input type="submit" value="View PO" onclick="generate()"/>

4 个答案:

答案 0 :(得分:2)

你可能想要这样的东西:

.factory('countries', function($http){
      var list = [];
      $http.get('../test.json').success(function(data, status, headers) {
          angular.copy(data, list);
      })

      return {
        list: list
      }
};

然后你可以像这样绑定到列表:

.controller('View2Ctrl', function ($scope, countries){
     $scope.countries = countries.list;
});

另一种同样有效的方法是:

.factory('countries', function($http){
      return {
        list: function() { return $http.get('../test.json'); }
      }
};

然后在你的控制器中:

.controller('View2Ctrl', function ($scope, countries){
     $scope.countries = [];
     countries.list().success(function(data) {
         $scope.countries = data;
     });
});

请记住,$http.get('../test.json')已经是一个承诺,这就是为什么你可以在没有任何不必要的承诺/解决处理的情况下返回它。

答案 1 :(得分:2)

因为您没有从$http请求中返回任何内容。 将您的代码更改为:

  .factory('countries', function($http, $q){
      return {
        list:  function(callback){
            var d = $q.defer();        
            $http.get('../test.json').success(function(data, status, headers) {

               console.log("success");
               console.log(data);
               //console.log(status);
               d.resolve(data);
            }).error(function(data, status) {

            //console.log("error");
            // console.log(data);
            // console.log(status);
               d.reject(data);
            });
            return d.promise;
  }
};

答案 2 :(得分:1)

首先,最好使用thencatch代替successerror。这样你就可以获得$http承诺的优势。

其次,您需要返回列表函数中的数据,如下所示:

$http.get('../test.json')
  .then(function(response) {
    return response;
  })
  .catch(function(response) {
    console.log(response);
  });

然后在您的控制器中,您只需要调用该函数:

$scope.countries = countries.list();

就是这样。

奖金:我是怎么做的。

在我的工厂里,我有获取集合和获取函数以及数据的数组变量。

.factory('countries', function($http) {
    var service = {
        fetch: fetch,
        get: get
    };

    var countries = [];

    return service;

    function fetch() {
        $http.get('../test.json')
            .then(set)
            .catch(function(err) {
                console.log(err);
            });
    }

    function set(data) {
        countries = data;
    }

    function get() {
        return countries;
    }
});

加载控制器时,您可以调用fetch函数来获取所有国家/地区,如果您将get函数传递给控制器​​,只要您想获取已经获取的国家/地区,就可以调用它。这样,当您不需要国家时,您不会向国家/地区提出额外请求。你也可以获得制造单身人士的工厂的优势。这样,这些数据(国家/地区)将在您注入国家/地区的每个控制器之间共享,直到您从工厂删除或更改数据(或刷新页面)。

.controller('View2Ctrl', function ($scope, countries){
    countries.fetch();
    $scope.getCountries = countries.get;
});

现在在您的视图中,您可以调用get函数来获取国家/地区。

<div ng-repeat="country in getCountries()"></div>

答案 3 :(得分:0)

我认为您应该将更改称为$ scope.countries = countries.list();运行发送请求到服务器。