Компонент 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)); }