Angular JS:使用 $http.get() 导入 JSON 数据 - 在控制器中工作,不在服务中 - 为什么

Angular JS: importing JSON data with $http.get() - works in controller, does not in a service - WHY?

本文关键字:控制器 工作 为什么 服务 数据 JSON 使用 JS http get 导入      更新时间:2023-09-26

我正在尝试将JSON数据导入到angularJS应用程序中。我将我的应用程序拆分为控制器和导入服务,但两者都在不同的文件中。我也在使用 bower、grunt 和 yeoman(这是由于工作,我不太习惯这些,也许还有一个问题。

奇怪的行为是:

我想使用 $http.get() 检索 JSON 数据并解析它 - 所有这些都在一个服务中完成,这样我就可以将数据对象从那里分发给主控制器,而不必在那里解析它。奇怪的是,我没有得到任何数据,它是空的或不可读的。然后我给出了我$http.get() mehtod 给出的承诺,并在控制器中解决了它。这不是我想要的,但现在它起作用了......但是为什么?

我想这是某个时候的失误,但我和我的团队成员都找不到。奇怪的是,做一个没有咕噜声的小测试应用程序,yeoman 和 bower 它奏效了。

我会感谢每一个提示或想法...贾娜

这是我在 NOT 工作版本中的代码,首先是带有控制器的主模块:

/** Main module of the application. */
(function () {
  'use strict;'
  angular.module('angularRegelwerkApp', [])
    .controller('RegelwerkCtrl', function ($scope, CategoryFactory) {
      $scope.categories = CategoryFactory.getCategories();
      $scope.subcategories = CategoryFactory.getSubCategories();
    }
  );
})();

服务部分:

(function () {
  'use strict';
  var app = angular.module('angularRegelwerkApp')
    .service('CategoryFactory',
    function ($http) {
      var categories = [];
      var subcategories = [];
      $http.get("../mockdata/categories.json").then(function (response) {
        categories = response.data;
      })
      $http.get('../mockdata/subcategories.json').then(function (response) {
        subcategories = response.data;
      })
      return {
        getCategories: function(){
          return categories;
        },
        getSubCategories: function(){
          return subcategories;
        }
      }
    }
  );
})();

这是我的工作版本的代码,首先是带有控制器的主模块:

/** Main module of the application. */
(function() {
  'use strict;'
  angular.module('angularRegelwerkApp', [])
    .controller('RegelwerkCtrl', function ($scope, CategoryFactory) {
      $scope.categories = [];
      $scope.subcategories = [];
      CategoryFactory.getCategories().then(function(response) {
        $scope.categories = response.data;
      });
      CategoryFactory.getSubCategories().then(function(response) {
        $scope.subcategories = response.data;
      });
    }
  );
}
)();

服务部分:

(function () {
  'use strict';
  var app = angular.module('angularRegelwerkApp')
    .service('CategoryFactory',
    function ($http, $q) {
      var categoryURL = "../mockdata/categories.json";
      var subcategoryURL = '../mockdata/subcategories.json';
      function getSubCategories() {
        return $http.get(subcategoryURL);
      }
      function getCategories() {
        return $http.get(categoryURL);
      }
      return {
        getCategories: getCategories,
        getSubCategories: getSubCategories
      }
    }
  );
})();

这会破坏您的引用,因此请从服务器循环数据并将其推送到您需要的变量中:

  $http.get("../mockdata/categories.json").then(function (response) {
    for(var x = 0; x < response.data.length; x++){
        categories.push(response.data[x]);
    }
  });

$http调用默认是异步的。

所以在你的第一个版本中,当你写得像$scope.categories = CategoryFactory.getCategories();您将获得空类别,因为当您访问类别时,它可能尚未加载响应数据。

你的应用像这样流动 -

  1. 加载控制器
  2. 您调用服务
  3. 服务呼叫$http
  4. 您尝试访问类别(但在从服务器返回响应之前,数据将不可用)
  5. $http.然后将数据加载到 $scope.类别

您将数据存储在 Angular 基元中,这些基元不会更新。 而是将所有数据存储在一个对象中,它应该可以工作(您还需要更新控制器)

(function () {
  'use strict';
  var app = angular.module('angularRegelwerkApp')
    .service('CategoryFactory',
    function ($http) {
      var data = {};
      $http.get("../mockdata/categories.json").then(function (response) {
        data.categories = response.data;
      })
      $http.get('../mockdata/subcategories.json').then(function (response) {
        data.subcategories = response.data;
      })
      return {
        getCategories: function(){
          return data.categories;
        },
        getSubCategories: function(){
          return data.subcategories;
        }
      }
    }
  );
})();