Компонент Angular2 "this" не определен при выполнении функции обратного вызова
у меня есть компонент, который вызывает службу для извлечения данных из конечной точки RESTful. Эта услуга должна быть предоставлена функция обратного вызова для выполнения после получения указанных данных.
проблема в том, что когда я пытаюсь использовать функцию обратного вызова для добавления данных к существующим данным в переменной компонента, я получаю EXCEPTION: TypeError: Cannot read property 'messages' of undefined
. Почему это this
неопределено?
версия TypeScript: версия 1.8.10
код контроллера:
import {Component} from '@angular/core'
import {ApiService} from '...'
@Component({
...
})
export class MainComponent {
private messages: Array<any>;
constructor(private apiService: ApiService){}
getMessages(){
this.apiService.getMessages(gotMessages);
}
gotMessages(messagesFromApi){
messagesFromApi.forEach((m) => {
this.messages.push(m) // EXCEPTION: TypeError: Cannot read property 'messages' of undefined
})
}
}
4 ответа:
использовать :
getMessages() { this.apiService.getMessages(this.gotMessages.bind(this)); }
здесь происходит то, что вы передаете
gotMessages
как обратный вызов, когда это выполняется область отличается и поэтомуthis
не то, что ожидали.
Элементbind
функция возвращает новую функцию, которая привязана кthis
вы определили.вы можете, конечно, использовать функции стрелочку там же:
getMessages() { this.apiService.getMessages(messages => this.gotMessages(messages)); }
Я предпочитаю
bind
синтаксис, но это зависит от вас.третий вариант так привязать метод для начала:
export class MainComponent { getMessages = () => { ... } }
или
export class MainComponent { ... constructor(private apiService: ApiService) { this.getMessages = this.getMessages.bind(this); } getMessages(){ this.apiService.getMessages(gotMessages); } }
или вы можете сделать это
gotMessages(messagesFromApi){ let that = this // somebody uses self messagesFromApi.forEach((m) => { that.messages.push(m) // or self.messages.push(m) - if you used self }) }
потому что вы просто передаете ссылку на функцию в
getMessages
вы не имеете праваthis
контексте.вы можете легко исправить это с помощью лямбды, которая автоматически связывает право
this
контекст для использования внутри этой анонимной функции:getMessages(){ this.apiService.getMessages((data) => this.gotMessages(data)); }