首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使FileReader与Angular2协同工作?

如何使FileReader与Angular2协同工作?
EN

Stack Overflow用户
提问于 2015-06-14 14:01:19
回答 5查看 45.8K关注 0票数 15

如何使FileReader与Angular2一起工作!

使用Angular2和类型记录从客户端读取文件时,

我试图以这种方式使用FileReader:

代码语言:javascript
复制
var fileReader = new FileReader();
fileReader.onload = function(e) {
    console.log("run fileReader.onload");
   //  ......
}

但是它根本不起作用,这个'fileReader.onload‘函数永远不会被调用。

确实需要一个阅读文件的解决方案,请帮助。谢谢

请从在线IDE中查看此代码:

预览:https://angular2-butaixianran.c9.io/src/index.html

编者:https://ide.c9.io/butaixianran/angular2

EN

回答 5

Stack Overflow用户

发布于 2015-08-04 06:13:03

首先,必须在模板中的输入表单中指定更改事件的目标:

代码语言:javascript
复制
@View({
  template:`
    <div>
      Select file:
      <input type="file" (change)="changeListener($event)">
    </div>
  `
})

如您所见,我将changeListener()方法绑定到(change)事件。我在课堂上的表现:

代码语言:javascript
复制
  changeListener($event) : void {
    this.readThis($event.target);
  }

  readThis(inputValue: any) : void {
    var file:File = inputValue.files[0]; 
    var myReader:FileReader = new FileReader();

    myReader.onloadend = function(e){
      // you can perform an action with readed data here
      console.log(myReader.result);
    }

    myReader.readAsText(file);
  }

侦听器将文件从事件传递到readThis方法。阅读这个已经实现了它自己的FileReader。您还可以在组件中而不是在函数中定义FileReader。

票数 33
EN

Stack Overflow用户

发布于 2015-12-01 20:34:01

@haz111的回答已经有效,但是如果您想让文件读取器成为一个可重用的组件,您可以使用这个或更好的方法:改进如下:

inputfilereader.ts

代码语言:javascript
复制
import {Component, ElementRef, EventEmitter} from 'angular2/angular2';

@Component({
    selector: 'filereader',
    templateUrl: './commons/inputfilereader/filereader.html',
    styleUrls: ['./commons/inputfilereader/filereader.css'],
    providers: [ElementRef],
    events : ['complete']
})

export class InputFileReader {
    complete :EventEmitter = new EventEmitter();

    constructor(public elementRef: ElementRef) {
    }

    resultSet:any; // dont need it 

    changeListener($event: any) {
        var self = this;
        var file:File = $event.target.files[0];
        var myReader:FileReader = new FileReader();
        myReader.readAsText(file);
        var resultSet = [];
        myReader.onloadend = function(e){
            // you can perform an action with data read here
            // as an example i am just splitting strings by spaces
            var columns = myReader.result.split(/\r\n|\r|\n/g);

            for (var i = 0; i < columns.length; i++) {
                resultSet.push(columns[i].split(' '));
            }

            self.resultSet=resultSet; // probably dont need to do this atall
            self.complete.next(self.resultSet); // pass along the data which would be used by the parent component
        };
    }
}

filereader.html

代码语言:javascript
复制
<input type="file" (change)="changeListener($event)" />

在其他文件中的使用

另一个文件让我们说dfs.ts

代码语言:javascript
复制
import {Component, ElementRef} from 'angular2/angular2';
import {InputFileReader} from '../../commons/inputfilereader/inputfilereader';

@Component({
    selector: 'dfs',
    templateUrl: './components/dfs/dfs.html',
    styleUrls: ['./components/dfs/dfs.css'],
    providers: [ElementRef],
    directives:[InputFileReader]
})

export class DfsCmp {
    constructor(public eleRef :ElementRef) {}

    callSomeFunc(data):void {
        console.log("I am being called with ", data);
    }
}

dfs.html

代码语言:javascript
复制
<filereader (complete)="callSomeFunc($event)"></filereader> 
票数 8
EN

Stack Overflow用户

发布于 2019-07-03 21:38:01

这里的派对有点晚了。这也可以作为服务创建FileReader。这将有助于单元测试,并将FileReader与正在使用它的组件分离。

您可以创建这样的令牌:

代码语言:javascript
复制
export const FileReaderService = new InjectionToken<FileReader>('FileReader', {
  factory: () => new FileReader(),
});

然后你可以像这样使用它:(我相信它可以作为一种常规的服务。我还没试过呢。但我在这里展示的方式效果很好)

代码语言:javascript
复制
class MyService { // this could be a component too
  constructor(@Inject(FileReaderService) private reader: FileReader) {}
  readFile() {
    const file = // the file you want to read
    this.reader.onload = // whateever you need
    this.reader.readAsDataURL(file)
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30830268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档