【问题标题】:Displaying json data in an Angular App在 Angular 应用程序中显示 json 数据
【发布时间】:2015-11-04 21:21:33
【问题描述】:

我正在尝试解析 json 文件中的数据并将其显示在我的 Angular 应用程序中,但由于某些奇怪的原因,视图不会显示数据(解释我的表达式),我认为它可能是我的控制器,但它看起来不错。任何帮助都可以解决这个问题,谢谢。

下面是我的 Http 服务的代码:

app.factory('info', ['$http', function($http){ 
  return 
  $http.get('https://api.flickr.com/services/feeds/photos_public.gne?&format=json&callback=JSON_CALLBACK')
      .success(function(data){
         return data;
      })
       .error(function(err){
         return err;
       });
}]);

这是我的控制器:

app.controller('HomeController', ['$scope','info',
 function($scope) {
    info.success(function(data){
        $scope.datar = data;
  });  
}]);

这是我的观点:

<div class="main" >
  <div class="container" >
  <div class="photo" >
  <div ng-controller="HomeController" ng-repeat="data in datar">
    <p1>{{data.age}}</p1>
   <p1>{{name.modified}}</p1>
  </div>
  </div>
  </div>
</div>

【问题讨论】:

    标签: angularjs angularjs-ng-repeat angular-services angular-controller


    【解决方案1】:

    由于您正在查询 JSONP 端点,您需要使用 $http.jsonp 方法。并且非常重要:将$http.jsonp 放在return 之后的同一 行,否则automatic semicolon insertion 将其转换为return;,基本上返回undefined

    app.factory('info', ['$http', function($http) { 
      return $http.jsonp('https://api.flickr.com/services/feeds/photos_public.gne?&format=json&jsoncallback=JSON_CALLBACK')
          .then(function(response) {
              return response.data;
          });
    }]);
    

    注意参数名称jsoncallback,而不仅仅是“回调”。

    之后,您的控制器还应使用 then 而不是 success(已弃用):

    app.controller('HomeController', ['$scope', 'info', function($scope, info) {
        info.then(function(data) {
            $scope.datar = data;
        });  
    }]);
    

    演示: http://plnkr.co/edit/yFomQ8jOZDRS6mZSBkGx?p=preview

    【讨论】:

    • 感谢您的回复,我刚刚完成了此操作,但仍然没有显示在我的视图中。还有什么想法吗?
    • @CodeArt 查看demo,主要问题是GET参数名,jsoncallback而不是“回调”。
    • 您也没有在控制器中完全注入 info 服务。在function($scope) 中添加info,这样它就是function($scope, info)
    • @Shane 非常感谢。
    • @dfsq 你太棒了!你的版本完全有效。非常感谢您的帮助!
    【解决方案2】:

    据我所知,您正在返回数据。在 AngularJS 中没有同步调用。

    你需要返回一个承诺

    app.factory('info', ['$http', '$q'], function($http, $q){ 
    
        var defer = $q.defer();
        $http.get('https://api.flickr.com/services/feeds/photos_public.gne?&format=json&callback=JSON_CALLBACK')
               .success(function(data){
                   defer.resolve(data);
               })
               .error(function(err){
                   defer.reject(err);
              });
    
        return defer.promise;
    }]);
    

    但是您还必须将控制器更改为:

    info.then(function (res) {
        $scope.datar = res;
    },function(err) {
        // hande error
    })
    

    【讨论】:

    • 您能否确认您已成功运行此代码(?),因为我认为 api_key 可能是问题所在。
    • 我相信,一旦您将工厂注入控制器,就会立即发送请求,这实际上是副作用。请在工厂中创建 get 方法,教他如何正确定义此类工厂。
    • 我完全按照上面的方式重写了我的代码,也没有成功。不过还是谢谢。
    【解决方案3】:

    $http 服务将返回具有以下属性的响应:

    data – {string|Object} – The response body transformed with the transform functions.
    status – {number} – HTTP status code of the response.
    headers – {function([headerName])} – Header getter function.
    config – {Object} – The configuration object that was used to generate the request.
    statusText – {string} – HTTP status text of the response.
    

    我也觉得你的工厂应该是这样的:

    app.factory('info', ['$http', function($http){ 
      return {
            get : function(){ 
      $http.get('https://api.flickr.com/services/feeds/photos_public.gne?&format=json&callback=JSON_CALLBACK');
    }}}]);
    

    在控制器中

    app.controller('HomeController', ['$scope','info',
     function($scope) {
        info.get()
      .success(function(response){
            $scope.datar = response.data;
      })
      .error(function(data) {
                        console.log('Error: ' + data);
                });  
    }]);
    

    如果您使用的是谷歌浏览器,您可以尝试右键单击 -> 检查元素,您将查看是否有一些错误,或者您可以在 javascript 中设置断点以查看您收到的确切数据。

    我推荐作为进一步阅读:

    https://docs.angularjs.org/api/ng/service/$http

    http://weblogs.asp.net/dwahlin/using-an-angularjs-factory-to-interact-with-a-restful-service

    【讨论】:

    • 谢谢你,我必须阅读那些文档,上面的代码也不起作用:/
    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2016-10-28
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多