J'ai un composant qui appelle un service pour récupérer des données à partir d'un point de terminaison RESTful. Ce service doit recevoir une fonction de rappel à exécuter après avoir récupéré lesdites données.
Le problème est que lorsque j'essaie d'utiliser la fonction de rappel pour ajouter les données aux données existantes dans la variable d'un composant, j'obtiens un EXCEPTION: TypeError: Cannot read property 'messages' of undefined
. Pourquoi est this
indéfini?
Version TypeScript: Version 1.8.10
Code contrôleur:
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
la source
la source
tsc -v
)Réponses:
Utilisez la fonction Function.prototype.bind :
Ce qui se passe ici, c'est que vous passez le
gotMessages
comme un rappel, lorsque cela est exécuté, la portée est différente et donc cethis
n'est pas ce que vous attendiez.La
bind
fonction renvoie une nouvelle fonction liée à celle quethis
vous avez définie.Vous pouvez, bien sûr, utiliser une fonction de flèche là aussi:
Je préfère la
bind
syntaxe, mais c'est à vous de décider.Une troisième option pour lier la méthode pour commencer:
Ou
la source
Ou tu peux le faire comme ça
la source
Parce que vous ne faites que passer la référence de fonction,
getMessages
vous n'avez pas le bonthis
contexte.Vous pouvez facilement résoudre ce problème en utilisant un lambda qui lie automatiquement le bon
this
contexte pour l'utilisation à l'intérieur de cette fonction anonyme:la source
J'ai le même problème, résolu en utilisant () => {} à la place function ()
la source
Veuillez définir la fonction
la source