Angular工厂不返回对象数组,而是返回单个对象

时间:2015-07-20 17:27:59

标签: json angularjs csv papaparse

我是角色新手,我正在尝试在工厂内加载CSV列表,然后将其转换为json。我在工厂内使用Papaparse(CSV到json库)。当我控制台登录工厂时,我得到的对象数组正是我想要的,但是当我在控制器中传递它时,我得到一个包含所有数据的对象。

这是我的工厂



(function() {

  var app = angular.module('test');

  app.factory('testFactory', ['$http', function($http) {

    var url = 'my-list.csv';

    var getContact = function() {

        return $http.get(url).success(function(data) {
            Papa.parse(data, {
                header: true,
                complete: function(results) {
                    console.log(results.data);
                    return results.data;
                }
            });
        });
      };

      return {
        getContact: getContact
      };
  }]);
}());




这是我的控制器



(function() {

  var app = angular.module('test');

  app.controller('testCtrl', ['$scope', 'testFactory', function($scope, testFactory) {

    testFactory.getContact().then(function(data) {
         $scope.contacts = data;
         console.log(data);
     });
     
  }]);

}());




我希望能够在我的视图中做到这样的事情

{{ contact.firstname }}

1 个答案:

答案 0 :(得分:1)

问题在于解决的顺序。检查控制台语句表明您已将$scope.contacts分配给$http.get承诺的解析,而不是实际解析。

而不是返回$http.get承诺,返回延迟的承诺并在解析结束时解决:

var parsePromise = $q.defer();
$http.get(url).success(function(data) {
    Papa.parse(data, {
        header: true,
        complete: function(results) {
            console.log(results.data);
            parsePromise.resolve(results.data);
        }
    });
});
return parsePromise.promise;

参见演示here

更新:根据评论,您可以使用.then来链接承诺,而不是创建新的deferred。 plunkr有两者,你可以使用changelog来切换方法。