【问题标题】:FileReader not loading file properly using AngularJSFileReader 没有使用 AngularJS 正确加载文件
【发布时间】:2014-11-27 17:49:55
【问题描述】:

我正在尝试将 csv 文件加载到 AngularJS 中,以便对内容进行一些操作。它不像我想要的那样工作。为了测试它是否正确加载,我将其加载到文本区域以查看内容。

当我加载文件时,它说它已正确加载,但在我加载第二个 CSV 文件之前,onload() 事件似乎没有触发,在这种情况下,第一个文件显示在 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 的新手,所以我不知道为什么会这样。

任何帮助都将不胜感激。

【问题讨论】:

  • 我认为你需要使用 $parse
  • @aarosil 你是什么意思?在哪里?
  • 您可以尝试以下操作:交换行 $scope.$apply(function()reader.onload = function(e) {,现在将 var reader = new FileReader(); 移动到 reader.onload 之前和 reader.readAsText(csvFile); 之后 reader.onload
  • @przno 是的!那行得通。如果你想把它写成答案,我会赞成并接受它。另外,如果您可以简短地解释一下为什么会起作用,我将不胜感激。 :)
  • 旁注 #1:onchange="angular.element(this).scope().fileChanged()" 不是正确的 Angular 方式,您应该使用 ng-change,例如 ng-change="fileChanged()"

标签: javascript html angularjs filereader


【解决方案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

【讨论】:

  • 如果这是基于接受的答案,您应该添加一个链接作为归属。没有必要包括“谢谢”或类似的东西;一旦你获得更多代表,这就是赞成票的目的。
  • 如果我还没有获得任何代表,我该如何添加链接?我想添加这个plnkr.co/edit/v65J4T?p=preview
  • 据我了解,通常那些少于 10 个代表的人可以在每个帖子中添加最多两个链接。无论如何,你去吧。请再次编辑以确保我已正确理解您的意思。
  • 好的,但是我放的代码,你要删除吗?
  • 我?不可以。只要您注明作者,CC-BY-SA 就允许复制和修改。
【解决方案2】:

重新排列你的代码的一些行,希望 cmets 足够解释

$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

【讨论】:

  • 由于$scope.$apply(function() {$scope.csvFile = reader.result;});,它现在工作了
  • 正是我想要的!
  • 迄今为止我见过的解决这个问题的最简单和最好的解决方案。 :thumbup
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
相关资源
最近更新 更多