То, что у вас есть, должно работать при вызове из кода TypeScript , так как семантика TypeScript / ES6 this
немного отличается для функций со стрелками.Вы можете прочитать больше об этом здесь , где есть целый раздел, посвященный горячему беспорядку, который this
.
Проблема здесь не в том, что this
относится к владельцуили вызываемый, но к элементу DOM.Вы можете убедиться в этом, вызвав console.log(this)
вверху вашей drop
функции.
Причина, по которой дела идут не так, как надо, состоит в том, что эта функция вызывается не из кода ES6 или TypeScript, а из события DOMобработчики.Чтобы заставить его сохранять this
, вы можете использовать функцию bind
.
constructor(private e: ElementRef) {
e.nativeElement.ondrop = this.drop.bind(this);
e.nativeElement.ondragover = this.dragOver.bind(this);
e.nativeElement.ondragenter = this.dragEnter.bind(this);
e.nativeElement.ondragleave = this.dragLeave.bind(this);
}
Обратите внимание, что this
является вашим экземпляром объекта, и теперь вы заставляете это быть так, создавая новыйиспользовать значение this
в соответствии с объяснением MDN .
В качестве альтернативы можно использовать встроенную функцию стрелки.
constructor(private e: ElementRef) {
e.nativeElement.ondrop = event => this.drop(event);
e.nativeElement.ondragover = event => this.dragOver(event);
e.nativeElement.ondragenter = event => this.dragEnter(event);
e.nativeElement.ondragleave = event => this.dragLeave(event);
}
Здесь это работаетпотому что функция стрелки сохраняет this
, как упоминалось ранее.