1

我是 Angular 新手,我正在尝试在工厂内加载 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 }}
4

1 回答 1

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;

在此处查看工作演示。

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

于 2015-07-20T18:16:55.517 回答