我是角色新手,我正在尝试在工厂内加载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 }}
答案 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来切换方法。