Angular Can';我不能在typescript中引用这个

Angular Can';我不能在typescript中引用这个,angular,typescript,Angular,Typescript,我的angular2应用程序中有一个文件上传,它将文件作为bytearray发送到Web服务。我使用文件读取器创建bytearray,它有一个onload事件。在这种情况下,我无法使用this.uploadService引用我的uploadService public uploadHandler(event) { var reader = new FileReader(); reader.onload = function() { var arrayBuffer

我的angular2应用程序中有一个文件上传,它将文件作为bytearray发送到Web服务。我使用文件读取器创建bytearray,它有一个onload事件。在这种情况下,我无法使用
this.uploadService
引用我的uploadService

public uploadHandler(event) {
    var reader = new FileReader();
    reader.onload = function() {
        var arrayBuffer = this.result, array = new Uint8Array(arrayBuffer), binaryString = String.fromCharCode.apply(null, array);
        //this.uploadService.DoUpload(binaryString);
    }
    reader.readAsArrayBuffer(event.files[0]);
}
我尝试使用胖箭头,但我不能再引用结果了

reader.onload = () => {
    //this.result does not exist anymore!
    var arrayBuffer = result, array = new Uint8Array(arrayBuffer), binaryString = String.fromCharCode.apply(null, array);
    this.uploadService.DoUpload(binaryString);
}
我想试试:

reader.onload=(事件:any)=>{
console.log(event.target.result);//结果应该存在
};
我想试试:

reader.onload=(事件:any)=>{
console.log(event.target.result);//结果应该存在
};

胖箭头是正确的选择。您还可以从reader变量而不是这个变量中获得结果。所以它可能看起来像这样

public uploadHandler(event) {
    var reader = new FileReader();
    reader.onload = () => {
        var arrayBuffer = reader.result;
        var array = new Uint8Array(arrayBuffer);
        var binaryString = String.fromCharCode.apply(null, array);
        this.uploadService.DoUpload(binaryString);
    };
    reader.readAsArrayBuffer(event.files[0]);
}

胖箭是正确的选择。您还可以从reader变量而不是这个变量中获得结果。所以它可能看起来像这样

public uploadHandler(event) {
    var reader = new FileReader();
    reader.onload = () => {
        var arrayBuffer = reader.result;
        var array = new Uint8Array(arrayBuffer);
        var binaryString = String.fromCharCode.apply(null, array);
        this.uploadService.DoUpload(binaryString);
    };
    reader.readAsArrayBuffer(event.files[0]);
}

我认为这应该解决您的问题,或者至少解决一些类似的方法,因为您在
绑定方面有问题

public uploadHandler(event) {
    var reader = new FileReader();
    var that = this;
    reader.onload = function() {
        var arrayBuffer = this.result, array = new Uint8Array(arrayBuffer), binaryString = String.fromCharCode.apply(null, array);
        that.uploadService.DoUpload(binaryString);
    }
    reader.readAsArrayBuffer(event.files[0]);
}

我认为这应该解决您的问题,或者至少解决一些类似的方法,因为您在
绑定方面有问题

public uploadHandler(event) {
    var reader = new FileReader();
    var that = this;
    reader.onload = function() {
        var arrayBuffer = this.result, array = new Uint8Array(arrayBuffer), binaryString = String.fromCharCode.apply(null, array);
        that.uploadService.DoUpload(binaryString);
    }
    reader.readAsArrayBuffer(event.files[0]);
}

onload
将事件对象作为参数传递,因此您可以在文档中检查是否可以获得“结果”,它似乎是
event.target.result
:。或者,如果您不想这样做,您仍然可以避免在特定情况下使用fat箭头,保留函数声明将有效地保留函数声明的“this”,因此您不会遇到任何进一步的问题。您需要保存词法范围。作为成员,声明私有myMethod:(anyParam:any)=>any;然后,在构造函数内部,您必须实现无法引用的方法。此外,
event.target.result
理论上应该与
reader.result
相同:在您的情况下,
var arrayBuffer=this.result
与编写相同:
var arrayBuffer=reader.result
,因为
.result
是FileReader对象的只读属性:。因此,您有三种解决问题的方法,最后一种可能是最快的方法。
onload
将事件对象作为参数传递,因此您可以在文档中检查是否可以获得“结果”,它似乎是
event.target.result
:。或者,如果您不想这样做,您仍然可以避免在特定情况下使用fat箭头,保留函数声明将有效地保留函数声明的“this”,因此您不会遇到任何进一步的问题。您需要保存词法范围。作为成员,声明私有myMethod:(anyParam:any)=>any;然后,在构造函数内部,您必须实现无法引用的方法。此外,
event.target.result
理论上应该与
reader.result
相同:在您的情况下,
var arrayBuffer=this.result
与编写相同:
var arrayBuffer=reader.result
,因为
.result
是FileReader对象的只读属性:。因此,您有三种解决问题的方法,最后一种可能是最快的方法。Result不是target的成员:属性'Result'在类型'EventTarget'上不存在@Karl:cast它为“any”而不是“EventTarget”。@Karl更新的answerResult不是target的成员:属性'Result'在类型'EventTarget'上不存在@Karl:cast它为“any”而不是“EventTarget”。@Karl更新了答案