Eu tenho um componente que chama um serviço para buscar dados de um ponto de extremidade RESTful. Este serviço precisa receber uma função de retorno de chamada para ser executado após a busca dos dados.
O problema é que, quando tento usar a função de retorno de chamada para acrescentar os dados aos dados existentes na variável de um componente, obtenho um EXCEPTION: TypeError: Cannot read property 'messages' of undefined
. Por que está this
indefinido?
Versão TypeScript: Versão 1.8.10
Código do controlador:
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
})
}
}
javascript
arrays
typescript
angular
Michael Gradek
fonte
fonte
tsc -v
)Respostas:
Use a função Function.prototype.bind :
O que acontece aqui é que você passa o
gotMessages
como callback, quando está sendo executado o escopo é diferente e entãothis
não é o que você esperava.A
bind
função retorna uma nova função que está vinculada ao quethis
você definiu.Você pode, é claro, usar uma função de seta lá também:
Eu prefiro a
bind
sintaxe, mas é com você.Uma terceira opção para ligar o método para começar:
Ou
fonte
Ou você pode fazer assim
fonte
Porque você está apenas passando a referência de função,
getMessages
você não tem othis
contexto certo .Você pode corrigir isso facilmente usando um lambda que vincula automaticamente o
this
contexto certo para o uso dentro dessa função anônima:fonte
Eu tenho o mesmo problema, resolvido usando () => {} em vez da função ()
fonte
Defina a função
fonte