AngularJS : Factory JSON 带有 HTTP GET 的数组

AngularJS : Factory JSON Array with HTTP GET

我正在开发我的第一个 AngularJS 应用程序,使用 Google 文档 API 向它传递 JSON 数据。 这是我使用的工厂示例:

app.factory('Data', ['$http', 'apiKeys', function($http, apiKeys){
  var googleDocs = 'https://spreadsheets.google.com/feeds/list/';
  return {
    news:function () {
      return $http.get(googleDocs + apiKeys.googleDoc +'/1/public/values?alt=json', {cache: true});
    },
    updates:function () {
      return $http.get(googleDocs + apiKeys.googleDoc +'/2/public/values?alt=json', {cache: true});
    },
    docs:function () {
      return $http.get(googleDocs + apiKeys.googleDoc +'/3/public/values?alt=json', {cache: true});
    }
}]);

我想清理一下代码并决定使用服务而不是在控制器本身中进行调用。它工作正常,但由于 Google API 的结构,我仍然需要编写长的 $scope,这让我很头疼。这就是我在控制器中获取值的方式:

app.controller('homeCt', ['$scope', 'Data', function ($scope, Data){
  Data.news().success(function (data) {
    $scope.totalNews = data.feed.entry.length;
  });
}]);

有没有一种方法可以设置工厂服务以仅使用以下方式将数据传递给我:

$scope.totalNews = Data.news()

或者至少删除 'feed.entry'?

Data.news().success(function (data) {
  $scope.totalNews = data.length;
});

非常感谢!

服务示例-用你想要的数据解决成功

app.service('Data', ['$http', 'apiKeys', function($http, apiKeys){
  var googleDocs = 'https://spreadsheets.google.com/feeds/list/';

 this.news =function(){

    return $http.get(googleDocs + apiKeys.googleDoc +'/1/public/values? alt=json', {cache: true})
    .then(function(data){

      return data.feed.entry.length;

   });
   }

}]);

控制器 - 由于您已经解决了服务中的数据,因此..

app.controller('homeCt', ['$scope', 'Data', function ($scope, Data){
  Data.news().then(function (data) {
    $scope.totalNews = data;
   });
}]);

工作示例

  var app = angular.module('app', ['ionic'])
 .service('Data', ['$http',
function($http) {
     var googleDocs =       'https://spreadsheets.google.com/feeds/list/1aC1lUSxKatfxMKEy1erKDSAKgijSWOh77FDvKWhpwfg/1/public/values?alt=json';
  this.news = function() {
    return $http.get(googleDocs, {
      cache: true
    }).then(function(res) {

      return res.data.feed.entry;
    });
  }
}
 ])
  .controller('homeCt', ['$scope', 'Data',
    function($scope, Data) {
  Data.news().then(function(data) {

    console.log(data);
  })
}
 ]);

我会给你一个方法,一个我根本不推荐的方法(服务不应该处理范围),但对我来说,如果你不这样做,这是你唯一的方法不想破坏你的 ajax 调用的 "async" :

app.factory('Data', ['$http', 'apiKeys', function($http, apiKeys){
  var googleDocs = 'https://spreadsheets.google.com/feeds/list/';
  return {
    news:news,
    updates: updates,
    [...]
  }

function news(scopeValue) {
  $http.get(googleDocs + apiKeys.googleDoc +'/1/public/values?alt=json', {cache: true}).success(function(data){
    scopeValue = data;
 });

}]);

然后,在你的控制器中这样调用它:

 Data.news($scope.totalNews);