JSON对象为angularjs工厂

时间:2015-09-26 23:42:05

标签: json angularjs factory

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

//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;
        });

});

3 个答案:

答案 0 :(得分:3)

代码中存在一些问题。我以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()方法处理“data”,然后()方法处理“response”。当我们处理then()方法时,我们应该考虑“response.data”来获取实际数据。 “响应”对象具有其他信息以及“数据”。以下是两种使用方式。

    // 1.success()方法。

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

    // 2.then()方法

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

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

答案 1 :(得分:1)

你需要注入&#34; itemsFactory&#34;进入你的控制器,并将你的工厂包装在一个函数中,所以它应该是这样的:

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;
         });
 });

答案 2 :(得分:0)

试试这个:

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