Die Implementierung eines asynchronen Sortierung Rohr in den Winkel-2
Ich versuche, erstellen Sie eine benutzerdefinierte Rohr im Winkel 2, die sortiert ein array von Objekten. Ich sammelte ein wenig Hilfe von dieser Beitrag. Aber ich kann nicht scheinen, um diese arbeiten.
Meine pipe sieht so aus:
@Pipe({
name: "orderByAsync",
pure: false
})
export class AsyncArrayOrderByPipe {
private _promise : Promise<Array<Object>>;
private _output: Array<Object>;
transform(promise: Promise<Array<Object>>, args: any): Array<Object>{
var _property : string = "";
var _descending : boolean = false;
this._property = args[0]["property"] || "";
this._descending = args[0]["descending"] || false;
if(!this._promise) {
this._promise = promise.then((result) => {
result.sort((a: any, b: any) => {
if (a[this._property] < b[this._property]) return (this._descending ? 1: -1);
else if (a[this._property] > b[this._property]) return (this._descending ? -1: 1);
else return 0;
});
this._output = result;
});
}
return this._output;
}
}
Den Einsatz des Rohr würde dann so Aussehen:
<div *ngFor="#c of countries | orderByAsync">{{c.name}}</div>
Es ist wie der Blick wird nie benachrichtigt, dass das Versprechen aufgelöst hat und die Daten zurückgegeben wurde.
Was bin ich?
- Kannst du bitte erstellen Sie einen quick-bin-so das snippet kann gespielt werden um.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den eingebauten
async
Rohr spritzt eineChangeDetectorRef
und fordertmarkForCheck()
auf, wenn das Versprechen aufgelöst wird. Tun es alle in einer pipe, die Sie befolgen sollten, dass Beispiel. Sie können das Typoskript Quelle für das hier.Ich würde vorschlagen, jedoch, zu vergessen, über den Umgang mit async auf Ihre eigenen, und statt zu schreiben, ein reines stateless Sortierung Rohr und Kette es mit dem eingebauten
async
Rohr. Für die, die Sie schreiben würde, die Pfeife zu behandeln bareArray
, nicht ein Versprechen, und verwenden Sie es wie diese:array.sort
warf einen Fehler. Vielleicht brauche ich nur den Griff ein leeres array zu beginnen, mit zu berücksichtigen, für die Verzögerung bei der gelöst-array. Ich gebe, dass ein Schuss.async
Rohr gibt null zurück, bevor das Versprechen aufgelöst wird, so dass Sie Ihre Pfeife muss um null ohne Fehler für die Verkettung zu arbeiten.null
Tipp.. ich bemerkt, dass dieses Verhalten, aber ich dachte, dass ich di einen Fehler und so habenull
.. Aber natürlich ist es das gewünschte Verhalten für eine noch nicht behoben, Versprechen 😉countries
ist ein normales array und ich habe meine eigene PipeloadAsyncData
. Das gibt ein Versprechen oder eine Zeichenfolge (je nach dem ob zusätzliche Daten geladen werden müssen; zum Beispiel: zusätzliche Daten werden nur geladen, wenn das Land ist "Schweiz". Sonst haben wir nur Anzeige der Namen). In diesem Fall würde die syntax würde sein:countries | loadAsyncData | async | orderBy
?loadAsyncData
Rohr immer wieder ein Versprechen. Wenn keine zusätzlichen Daten geladen werden muss, können Sie die Rückgabe eines bereits abgeschlossenen Versprechen, aber es ist immer ein Versprechen, weil das ist, was dieasync
pipe-handles. Nach dieser Veränderung, Ihre syntax wäre richtig.Einfach wieder ein BehaviorSubject aus dem Rohr, die dann erhalten, gebunden mit angular-async-Leitung.
Kleines Beispiel (legen Sie es in Ihre transform-Methode des Rohr -) die sollte man 'value' nach 3 Sekunden:
Komplettes Beispiel:
FormsReflector
trotz könnte ich Schätze seine Funktionalität. Für Ihre inspiration, +1.