2016-08-07 20 views
1

Ich fühle mich wie etwas hier fehlt. Ich habe einen Dienst, der einige Daten ergreift. Ich wandle es in ein Versprechen um und versuche dann, die Daten in einer separaten Methode zu bearbeiten.Angular 2. Verlieren Umfang davon in Promise

Wenn es einmal die Methode trifft, verliere ich die Fähigkeit, auf meine Objekte zuzugreifen, auf die ich normalerweise von this.whatever zurückgreifen würde. Wenn ich den gesamten Code aus dem addJobsToTree im then-Block belasse, funktioniert es einwandfrei. Ich kann auch von überall dort auf die Komponente zugreifen. Ich bin mir sicher, dass ich etwas Dummes mache, aber ich kann es nicht herausfinden.

ngOnInit(){ 
    this._scheduleDataService.getSavedScheduleData(this.buildDateStringFromCalendar(),1004) 
     .toPromise() 
     .then(this.addToJobsTree); 
} 
private addToJobsTree(res){ 
    for(let xx of res){ 
     this._sharedService.jobs.push(xx); //Comes back as cannot read _sharedService of null 
     console.log(this._sharedService.jobs); 
    } 
} 
+0

Mögliche Duplikate von [Wie man auf den richtigen \ this \ '/ Kontext innerhalb zugreifen ein Rückruf?] (http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback) –

Antwort

7

Es ist, weil Sie eine Funktion referenzieren und Sie den Kontext der Funktion verlieren. Um das zu beheben, müssen Sie die Funktion explizit mit einem Objekt verknüpfen.

können Sie verwenden entweder die bind Methode:

ngOnInit(){ 
this._scheduleDataService.getSavedScheduleData(this.buildDateStringFromCalendar(),1004) 
     .toPromise() 
     .then(this.addToJobsTree.bind(this); // <----- 
} 

(Anmerkung: hier ist der Nachteil der bind Methode mit Typoskript zu verwenden: https://basarat.gitbooks.io/typescript/content/docs/tips/bind.html)

oder einen Pfeil Funktion das zu beheben:

ngOnInit(){ 
this._scheduleDataService.getSavedScheduleData(this.buildDateStringFromCalendar(),1004) 
     .toPromise() 
     .then((data) => { // <----- 
     this.addToJobsTree(data); 
     }); 
} 
+0

danke bro. Es funktionierte mit 'bind (this)' – BlueBird