【问题标题】:JSON object as angularjs factoryJSON对象作为angularjs工厂
【发布时间】:2015-09-26 23:42:05
【问题描述】:

我有一个本地对象,我想把它变成一个工厂,以便我的主控制器可以使用它:

//factory
app.factory('items', function($http) {
        var items= {}; // define factory object
    var items = $http.get('pathtojson/data.json').success(function(response) {
        return response.data;
    });
    return items; // returning factory to make it ready to be pulled by the controller

});

控制器内部(Mainctrl):

<div class="container" ng-repeat="item in items.data"  ...

但是,什么也没有发生。我首先通过将json作为数组直接粘贴到工厂中来测试它,所以我有:

app.factory("items", function () {
    var items = {};
    items.data = [{name: "value"}, {name: "value1"}etc. }];
    return items;
});

以上工作正常。我使用this thread 作为参考,但无法让它工作。我做错了什么?

=================

编辑

var app = angular.module('app', []);

//factory
app.factory('itemsFactory', function($http) {

  return {
      getItems: function () {
         return  $http.get('pathtojson/data.json');
      }
}


});

//controller
app.controller('MainCtrl', function($scope, itemsFactory){
  itemsFactory.getItems().then(function(response){
              $scope.items = response;
        });

});

【问题讨论】:

  • 在您的第一个代码示例中,您返回factory,但在您的第二个代码示例中,您返回items。在您的第一个代码示例中,itemsfactory 有何关系?
  • 抱歉,这是一个旧版本。 (修正)问题还是一样。
  • 我建议设置一个小提琴。

标签: json angularjs factory


【解决方案1】:

代码中的问题很少。我以 github API 为例,同样的事情也适用于您的示例(data.json 数据)。

  1. 工厂服务代码应该是这样的。应该有一个对象,并且可以挂钩该对象的属性/方法,并且需要返回相同的对象。在这个例子中,getItems() 方法被钩住了。

     app.factory('itemsFactory', function($http) {
       var factory = {};
    
       factory.getItems = function () {
        return  $http.get('https://api.github.com/users/angular/repos');  
       };
    
       return factory;
    });
    
  2. 这里有两种写控制器的方法。一种是使用 success() 方法,另一种是使用 then() 方法。这两种方法的用法是有区别的。 success() 方法处理“数据”,then() 方法处理“响应”。当我们处理 then() 方法时,我们应该考虑“response.data”来获取实际数据。 “响应”对象与“数据”一起具有其他信息。以下是两种使用方法。

    // 1.success() 方法。

    app.controller('MainCtrl', function($scope, itemsFactory){
    itemsFactory.getItems().success(函数(数据){ $scope.items = 数据; }); });

    // 2.then() 方法

    app.controller('MainCtrl', function($scope, itemsFactory){ itemsFactory.getItems().then(function(response){ $scope.items = response.data; }); });

JSFiddle 上的现场演示:http://jsfiddle.net/rajkarri/hejr5e8o/1/

【讨论】:

  • Rethabile 的反应很棒,现在就实施。下面 Rethabile 建议的相同 console.log(response) 是否可以用于 $scope.items (目前我得到未定义的项目),因为我想了解响应和数据之间的区别是什么。
  • 另外,为了通过另一个函数访问我的 JSON 数据,我必须按照以下方式进行操作:app.getSelectedRating = function (rating) { $scope.rating = 0; $scope.ratings = ItemsFactory.response.data(model.rating) ...
【解决方案2】:

您需要将“itemsFactory”注入您的控制器,并将您的工厂包装在一个函数中,使其看起来像这样:

app.factory('itemsFactory', function($http) {
return {
    getItems: function () {
       return  $http.get('pathtojson/data.json');
    }
}

 app.controller("Mainctrl", function(itemsFactory, $scope){

         itemsFactory.getItems().then(function(response){
               $scope.items = response;
         });
 });

【讨论】:

  • 我进行了修改,但出现错误:[ng:areq] Argument 'MainCtrl' is not a function, got undefined
  • 我又修改了。见上文编辑。它们是 app.conroller 上方的语法错误。但是,现在没有错误,也没有数据。该页面只是“静默”
  • 在控制器中的 $scope.items 上方放置一个“console.log(response)”,然后在浏览器中转到开发人员选项卡并告诉我它在控制台下显示的内容。
【解决方案3】:

试试这个:

<div class="container" ng-repeat="item in items" ..

【讨论】:

  • HI Ibrahimovic,这仍然不起作用。根本找不到数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多