2016-04-14 3 views
0

Ich mache einen JSONP-Aufruf mit Informationen aus einem Array von "Schlüsseln", die in einer bestimmten Reihenfolge sind. Ich möchte, dass das resultierende neue Array die gleiche Reihenfolge wie das Quell-Array von Schlüsseln hat. Dies geschieht manchmal, aber nicht immer.* ngFor gerenderte Reihenfolge ist nach einem HTTP/JSONP-Aufruf unzuverlässig?

Ich habe versucht forEach, for-Schleife, ein einfaches Array mit nur die Schlüsselwerte und ein Array mit dem Feld "Name", gefolgt von dem Schlüsselwert. Keine Ahnung, warum ich keine einheitliche Bestellung bekommen kann. Das Folgende ist mit einem einfachen Array und nur Schlüsselwerten.

/*separate defining class*/ 
export class ArrayObjectItem { 
    city: string; 

constructor(city: string) { 

this.city = city; 
} 

    } 
    /**/ 

    /*Below follows the code inside the main bootstrapped/rendering component*/ 

names: [] = ['name1', 'name2', 'name3', 'name4', 'name5']; 
arraytorender: Array<ArrayObjectItem>[] = []; 

this.names.forEach(name => { 
    this.aJSONPservice.getData(name).subscribe(response => { 
    const objectinarray = new ArrayObjectItem("null"); 
    objectinarray.city = response.city; 
this.arraytorender.push(objectinarray); 

}); 
}); 

Nach Ansicht der Hauptkomponente:

<div *ngFor="#item of arraytorender"> 
{{item.city}} 
</div> 
+0

Ich sehe nicht, wie dies mit HTTP/JSONP verwandt sein kann. Kannst du einen Plunker erstellen, der es erlaubt zu reproduzieren? –

+0

Nur weil die HTTP-Anfragen in einer bestimmten Reihenfolge gesendet werden, gibt es keinen Grund anzunehmen, dass die Antworten in derselben Reihenfolge zurückkommen. Sie werden in der Reihenfolge, in der die Anfragen abgeschlossen wurden, und nicht in der Reihenfolge, in der sie ausgegeben wurden, in "arraytorender" verschoben. – Duncan

+0

Hey Gunter, bitte sieh dir diesen Codepen an. Nicht genau die gleiche Programmstruktur, aber Sie werden sehen, dass jedes ArrayObjectItem die gleiche Stadt aus dem HTTP-Aufruf und einen anderen Namen als "Namen" hat. Anstelle von "Same Location Name1" und dann "Same Location Name2" usw. ist der "Arraytorender" in einer beliebigen Reihenfolge. http://codepen.io/webdev689/full/aNYjRM. – coder

Antwort

1

*ngFor das Richtige tut. Das Array ist einfach nicht sortiert.
Wenn Sie es sortieren Sie das gewünschte Ergebnis erhalten:

ngOnInit():any { 
    this.names.forEach(name => { 
     this._cityService.getCity().subscribe(response => { 
     const objectinarray = new ArrayObjectItem("null", "null"); 
     objectinarray.city = response.city; 
     objectinarray.namefromkeys = name; 
     this.arraytorender.push(objectinarray); 
     this.arraytorender.sort((a,b) => { 
      if(a.namefromkeys == b.namefromkeys) { 
      return 0; 
      } 
      if(a.namefromkeys > b.namefromkeys) { 
      return 1; 
      } 
      return -1; 
     }); 
     }); 
    }) 
    } 
+0

Es hat nicht für mich funktioniert. – coder

+0

Ihre überarbeitete Lösung funktioniert - vielen Dank! Ich bin ein neuer Benutzer hier, so kann nicht upvote oder geben Sie die beste Antwort für die erste richtige Lösung (die nach Ihnen ist auch richtig). – coder

+0

Mach dir keine Sorgen. Danke für das Feedback :) –

0

Sie haben Array nach jedem Stoß zu sortieren, da Antworten in zufälliger Reihenfolge kommen:

this.arraytorender.push(objectinarray); 
this.arraytorender.sort((a,b)=>{ 
    if (a.city < b.city) 
    return -1; 
    else if (a.city > b.city) 
    return 1; 
else 
    return 0; 
}); 

Möglicherweise müssen Sie ändern Trigger erzwingen:

this.arraytorender = this.arraytorender.concat(); 
+0

Ich brauchte nicht die concat() Sachen, aber die Sortierlogik ist richtig. Vielen Dank. Entschuldigung, als neuer Nutzer kann ich nicht updaten. Jemand hat vor dir mit der gleichen Antwort geantwortet. – coder

Verwandte Themen