2016-06-23 9 views
4

Ich versuche, Bilder zu einem Array hinzuzufügen und sie auf dem Bildschirm anzuzeigen. Ich möchte die Bilder erst anzeigen, nachdem der Browser sie geladen hat. Ich habe einen .onload-Rückruf für das Bildobjekt angegeben und füge das Bild dem Array innerhalb dieses Callbacks hinzu. Die Benutzeroberfläche wird nur aktualisiert, wenn ein Klickereignis oder ein anderes "Ereignis ändern" eintritt. Ich habe nach Observablen geschaut, aber ich habe das Gefühl, dass das ein bisschen übertrieben für so etwas ist. Ich glaube an eckige 1 gab es eine Art von $ Uhr, die zu Klasseneigenschaften getan werden könnte. Das scheint trivial zu sein ... das Objekt wird aktualisiert, die Benutzeroberfläche sollte es widerspiegeln. Jede Hilfe wird geschätzt. Danke :)Angular 2 UI wird nicht aktualisiert, wenn Objekte zum Array hinzugefügt werden image.onload()

Hier ist eine plunker demonstrieren, was ich versuche zu tun. Ich füge X-Kätzchen im Konstruktor hinzu. Wenn dieser Code entfernt wird, die erste „Kätzchen hinzufügen“ drücken wird die Benutzeroberfläche aber nachfolgende Zugaben von Kätzchen nicht aktualisiert vorherige Kätzchen zeigen ...

private addItem(itemsArray) { 
    var randomnumber = Math.floor(Math.random() * (500 - 200 + 1)) + 200; 
    var imageObj = new Image(); 
    imageObj.src = "http://placekitten.com/300/"+randomnumber; 

    imageObj.onload = function() {  
     itemsArray.push(imageObj); 
    } 
} 
+0

Hier ist der gleiche Code, aber mit dem ersten Aufruf im Konstruktor auskommentiert. [Plocker] (http://embed.plnkr.co/shHj0Q7x5QmoyZCosDMx/). Ich drucke auch die 'src' und es scheint gut zu funktionieren. – Erevald

+0

Ihr Plünderer funktioniert nicht in Safari 9.1.1. Welchen Browser benutzen Sie? Ich glaube, es ist ein Hit in Chrom. Der erste Klick bringt keine Kätzchen auf die Benutzeroberfläche und nachfolgende Klicks rendert die vorherigen Kätzchen. – crizzwald

+0

Es funktioniert die ganze Zeit in Chrom für mich, einige Bilder sind sehr ähnlich, überprüfen Sie die URL für einen Hinweis. – Erevald

Antwort

3

ich nicht in dem Plunker (mit Chrom) wiedergeben kann

könnten Sie versuchen, explizit Änderungserkennung

export class App { 
    public items: any = [] 
    constructor(cdRef:ChangeDetectorRef) { // <<<== add parameter 
    this.addItems(); 
    } 

    addItems() { 
    for(var i = 0; i < 3; i++) 
    { 
     this.addItem(this.items); 
    } 
    } 

    private addItem(itemsArray) { 
    var randomnumber = Math.floor(Math.random() * (500 - 200 + 1)) + 200; 
    var imageObj = new Image(); 
    imageObj.src = "http://placekitten.com/300/"+randomnumber; 

    imageObj.onload =() => { // <<<== change from function() to() =>  

     itemsArray.push(imageObj); 
     this.cdRef.detectChanges(); // <<<== invoke change detection 
     //alert("added"); 
    } 
    } 
} 

Mein Verdacht aufzurufen

ist, dass

imageObj.onload =() => { 

kann nicht ordnungsgemäß in allen Browsern gepatcht werden. Wenn der Rückruf außerhalb der Angulars-Zone ausgeführt wird, wird er nicht benachrichtigt und führt keine Änderungserkennung durch.

Dieses

imageObj.addEventListener('load',() => {  

könnte es auch lösen (und wäre die bessere Option sein, wenn sie es so gut lösen - schwer zu sagen, ohne reproduzieren zu können - ich habe keine Safari um).

Plunker example

+2

das Hinzufügen des Event Listeners funktioniert wie ein Champion in Safari! Vielen Dank! – crizzwald

+0

Freut mich zu hören. Ich habe keine Safari um es selbst zu testen. –

Verwandte Themen