2015-07-20 61 views
1

我是新的角度,我試圖加載工廠內的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

因此,來自工廠的'console.log(results.data)'給出了與控制器中的'console.log(data)'不同的東西嗎? – Tom

+0

對不起,他們是不同的。工廠結果返回數組對象,控制器返回一個包含所有數據的對象。 – pap

+0

我認爲如果將'$ http.get(url).success'更改爲'$ http.get(url)。 '在工廠 – Tom

回答

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來切換方法。

+0

非常感謝你!這正是我所期待的。真的不夠感謝你! – pap

+0

沒問題。我更新了[plunkr](http://plnkr.co/edit/fzvoGJJH3zxVPNhatMBP?p=preview)以使用'.then'策略。您可以使用plunkr更新日誌進行比較。 – Tony

+0

您認爲最適合我的情況和一般最佳做法?他們似乎工作得很好。 – pap