Angular2 + Typescript + FileReader.onLoad = 属性不存在

Posted

技术标签:

【中文标题】Angular2 + Typescript + FileReader.onLoad = 属性不存在【英文标题】:Angular2 + Typescript + FileReader.onLoad = property does not exist 【发布时间】:2017-06-03 21:44:30 【问题描述】:

我正在使用 FileReader 接口,它是异步方法 readAsText() 来读取本地文本文件, 之后,当调用 onload 事件 时,我尝试读取我的文件,我的源代码如下所示:

export class ReadFileComponent 
   text: string;

   readFile(): void 
     let reader=new FileReader();
     reader.onload = function(e) 
        this.text=reader.result;
     
     reader.readAsText(file);   
   

编译失败,因为属性 "text" 在类型 "FileReader"

上不存在

我认为这是由于 EventListener 接口不接受对象,

请问有人解决了这种问题吗?

谢谢大家,

【问题讨论】:

【参考方案1】:

如果要在回调中使用this,请使用箭头函数,否则不起作用

reader.onload = (e) => 
    this.text=reader.result;

https://developer.mozilla.org/en/docs/Web/javascript/Reference/Functions/Arrow_functions

【讨论】:

不,它适用于 console.log(reader.result),问题在于“this”意味着 currentTarget 属性是 EventTarget 类型,而不是 ReadFileComponent 类的类型 这就是为什么你需要使用()=> 而不是function ()。箭头函数确保回调中的this 一直指向当前类。 对..也许this会澄清它 不幸的是,“reader.onload”部分似乎在生产中不起作用[在 ng build — prod 之后]。原因是非 Angular 版本是: reader.onload = function(evt) 因为这不使用箭头函数,所以没有传入父上下文。在 Angular 中,我们需要访问父上下文,因此使用箭头函数。实际发生的情况是,使用箭头函数将整个“onload”函数传递给“reader.result”。 让 FileReader: new() => FileReader = ((window as any).FileReader as any).__zone_symbol__OriginalDelegate;让阅读器=新文件阅读器();这允许将事件正确传递给“onload”,这反过来又允许我们使用“event.target.result”【参考方案2】:

您在这里使用的是常规的 javascript 函数:

 reader.onload = function(e) 
        this.text=reader.result;
     

this 属于函数而不是你的类。

使用箭头函数

reader.onload = (e)=> 
            this.text=reader.result;
         

或者

self = this;
 reader.onload = function(e) 
        self.text=reader.result;
     

【讨论】:

以上是关于Angular2 + Typescript + FileReader.onLoad = 属性不存在的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular2 中访问 Typescript 对象变量

在 Angular2 TypeScript 中注释(出)代码

Typescript - 如何在 Angular2 中正确使用 jsPDF?

Angular2 或 TypeScript 用零填充字符串

Angular2 + Typescript + FileReader.onLoad = 属性不存在

Angular2-Webpack-Typescript - 3rd 方库