2017-11-23 4 views
1

Ich habe eine Methode zum Lesen von Daten von Link. Ich versuche auf Bilder mit einer Breite von mehr als 600 zuzugreifen, aber alert (this.images.length); dies immer Null geben und diese ausgeführt wurde vor meinem Anruf AnrufBehandlung Rückruf in Winkel 2

readLink(url: string) { 
this.isBusy = true; 
this._http.get(`${this._helper.baseURL}/api/post/readlink?url=${encodeURIComponent(url)}`) 
    .subscribe(
    data => { 
    this.processResponse(data, url); 
    }, 
    (err: HttpErrorResponse) => { 
    } 
); 
} 

Verfahren die Anforderungsdaten zu verarbeiten

processResponse(result, url) { 
if (result.images != null && result.images.length > 0) { 
    result.images.forEach(el => { 
    this.getMeta(el, function (res) { 
     this.images.push(res); 
     this.currentImage = this.images[0]; 
    }); 
    }); 
} 
alert(this.images.length); // this always give zero and this was executed before my call bakc 
} 

diese Funktion zurückrufen zurückgerufen gültige Bilder

getMeta(url, callback) { 
const img = new Image(); 
img.src = url; 
img.onload = function() { 
    if (img.width > 260 && img.height > 150) { 
    callback(url); 
    } 
}; 
zu erhalten

}

Antwort

2

Wenn Sie this innerhalb der Funktion verwenden, verwenden Sie nicht function() {

this.getMeta(el, function (res) { 

sollte

this.getMeta(el, (res) => { 

sonst this wird nicht auf die Klasseninstanz verweisen, auf dem die Funktion definiert ist.

Siehe auch https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

+1

Dank es funktioniert jetzt! – user1328004

+0

froh zu hören du könntest es funktionieren lassen :) –

+1

@ GünterZöchbauer +1 für die Antwort wenn wir Funktion() nicht verwenden sollen. Ich war verwirrt und nicht für so viele Tage klar :) –