2014-10-02 78 views
5

我想加載一個csv文件到AngularJS,所以我可以做一些操作的內容。這不是我想要的。爲了測試它是否正確加載,我將它加載到textarea中以查看內容。FileReader無法正確加載文件使用AngularJS

當我加載文件時,它表示它正確加載,但onload()事件似乎沒有被觸發,直到我加載第二個CSV文件,在這種情況下FIRST文件顯示在textarea中。

HTML:

<div> 
    <input ng-model="csv" 
      onchange="angular.element(this).scope().fileChanged()" 
      type="file" accept=".csv" id="fileInput"/> 
</div> 
<br/> 
<div> 
    <textarea ng-model="csvFile" readonly="true" style="width:99%; height:500px" disabled></textarea> 
</div> 

JS:

$scope.fileChanged = function() { 

    $scope.$apply(function() { 
     var csvFileInput = document.getElementById('fileInput'); 
     var reader = new FileReader(); 
     var csvFile = csvFileInput.files[0]; 
     reader.onload = function(e) { 
      $scope.csvFile = reader.result; 
     }; 
     reader.readAsText(csvFile); 
    }); 
}; 

當我把這個進入的jsfiddle,該文件不會出現在textarea的根本。我是JSFiddle的新手,所以我不知道爲什麼會這樣。

任何幫助都將不勝感激。

+0

你需要使用$ parse我認爲 – aarosil 2014-10-02 17:43:19

+0

@aarosil你是什麼意思?哪裏? – UpAllNight 2014-10-02 18:11:33

+1

你可以嘗試以下方法:swap行$ scope。$ apply(function()'和'reader.onload = function(e){'現在移動'var reader = new FileReader();''reader.onload ''和'reader.readAsText(csvFile);''在'reader.onload'後面的塊 – przno 2014-10-02 18:49:36

回答

13

重新排列你的代碼的某些行,希望評論是說明性足夠

$scope.fileChanged = function() { 

    // define reader 
    var reader = new FileReader(); 

    // A handler for the load event (just defining it, not executing it right now) 
    reader.onload = function(e) { 
     $scope.$apply(function() { 
      $scope.csvFile = reader.result; 
     }); 
    }; 

    // get <input> element and the selected file 
    var csvFileInput = document.getElementById('fileInput');  
    var csvFile = csvFileInput.files[0]; 

    // use reader to read the selected file 
    // when read operation is successfully finished the load event is triggered 
    // and handled by our reader.onload function 
    reader.readAsText(csvFile); 
}; 

參考:FileReader at MDN

+0

現在因爲'$ scope。$ apply(function(){$ scope.csvFile = reader.result;});' – raghavsood33 2015-10-17 19:29:42

+0

就是我正在尋找的! – 2017-04-07 15:04:10

1

這僅僅是在HTML輕微改善:

<input type="file" onchange="angular.element(this).scope().file_changed(this)"/> 
<textarea cols="75" rows="15">{{ dataFile }}</textarea> 

和控制器:

.controller('MyCtrl', ['$scope', function($scope) { 
    var vm = $scope; 

    vm.file_changed = function(element){ 
     var dataFile = element.files[0]; 
     var reader = new FileReader(); 
     reader.onload = function(e){ 
      vm.$apply(function(){ 
       vm.dataFile = reader.result; 
      }); 
     }; 
     reader.readAsText(dataFile); 
    }; 
}]); 

Ref

+0

如果這是基於接受的答案,則應該添加一個鏈接作爲歸因。沒有必要包含「謝謝」或類似的內容;這就是upvotes是什麼,一旦你得到更多的代表。 – 2015-04-04 04:52:55

+0

如果我還沒有得到任何代表,我該如何添加鏈接?我想添加這個http://plnkr.co/edit/v65J4T?p=preview – 2015-04-04 16:29:48

+0

通常那些代表少於10的人可以爲每個帖子添加多達兩個鏈接,據我所知。無論如何,你去了。請再次編輯,以確保我已正確理解您的意思。 – 2015-04-04 19:39:38