Ich habe eine Komponente, die einen Dienst aufruft, um Daten von einem RESTful-Endpunkt abzurufen. Dieser Dienst muss eine Rückruffunktion erhalten, die er nach dem Abrufen der Daten ausführen kann.
Das Problem ist, wenn ich versuche, die Rückruffunktion zu verwenden, um die Daten an die vorhandenen Daten in der Variablen einer Komponente anzuhängen, erhalte ich eine EXCEPTION: TypeError: Cannot read property 'messages' of undefined
. Warum ist this
undefiniert?
TypeScript-Version: Version 1.8.10
Controller-Code:
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
quelle
quelle
tsc -v
)Antworten:
Verwenden Sie die Funktion Function.prototype.bind:
Was hier passiert, ist, dass Sie das
gotMessages
als Rückruf übergeben. Wenn dies ausgeführt wird, ist der Bereich anders und dasthis
ist nicht das, was Sie erwartet haben.Die
bind
Funktion gibt eine neue Funktion zurück, die an die vonthis
Ihnen definierte gebunden ist .Natürlich können Sie dort auch eine Pfeilfunktion verwenden :
Ich bevorzuge die
bind
Syntax, aber es liegt an Ihnen.Eine dritte Option, um die Methode zunächst zu binden:
Oder
quelle
Oder du kannst es so machen
quelle
Da Sie nur die Funktionsreferenz übergeben, haben
getMessages
Sie nicht den richtigenthis
Kontext.Sie können dies leicht beheben, indem Sie ein Lambda verwenden, das automatisch den richtigen
this
Kontext für die Verwendung innerhalb dieser anonymen Funktion bindet :quelle
Ich habe das gleiche Problem, das mit () => {} statt function () behoben wurde.
quelle
Bitte definieren Sie die Funktion
quelle