2016-12-20 4 views
5

Ich benutze Schlüssel pipe in * ngfor Schleife. Daten werden in JSON eingespeist.Angular 2 - * ngFor mit Schlüssel Rohr wird nicht aktualisiert, wenn Objekt geändert wird

@Pipe({ 
     name: 'keys' 
    }) 
    export class KeysPipe implements PipeTransform { 
     transform(value, args: string[]): any { 
     if (!value) { 
      return value; 
     } 

     let keys = []; 
     for (let key in value) { 
      keys.push({key: key, value: value[key]}); 
     } 
     return keys; 
     } 
    } 

-

<div *ngFor="let item of jsonObject | keys"> 
     <p>{{ item.value.code }}</p> 
</div> 

Das Problem ist, wenn ich auf des Elements in JSON löschen, wird ngFor nicht aktualisiert.

Ich habe zwei Optionen bereits versucht:

  • this.applicationRef.tick Aufruf(); nach Elemente löschen, keine Änderung
  • unreinen pipe "rein: false". Das verursachte enormen Speicherverbrauch in Chrome in Hunderten von MBs und ich musste den Prozess beenden.

Wenn es anders geht?

Danke!

+0

Versuchen 'ChangeDetectionStrategy' Einstellung' OnPush'. –

Antwort

5

Eine Möglichkeit, um eine tiefe Kopie von temp JSONObject versuchen, die Sie ausprobieren können:

delete(id) { 
    this.jsonObject = this.jsonObject.filter(x => x.id !== id); 
} 

diese Weise können Sie nicht das ursprüngliche Array mutiert. Das ist crutial Sache für Rohr

Siehe auch

+0

Danke, dass Sie mich in die richtige Richtung zeigen. Ich habe das Objekt nach Schlüsselnamen gefiltert und Filter und Reduzieren verwendet. Der tatsächliche Code ist hier, wenn jemand interessiert ist: http://codepen.io/anon/pen/MbxOeG – daemon

2

Pure Rohre werden nicht ausgeführt, es sei denn, die Referenz oder der Wert wird geändert. Um dies zu beheben, fügen Sie pure: false zu Ihrem Rohrdekorateur hinzu. Siehe Pipes

ex.

@Pipe({ 
    name: 'keyVal', 
    pure: false 
}) 
export class KeyValPipe implements PipeTransform { 
    ... 
} 

EDIT ich nicht sehen, dass die OP bereits getan hatte. Eine andere Option besteht darin, eine temporäre Variable festzulegen und dann jsonObject zuzuweisen, wodurch eine neue Referenz erstellt wird. Sie könnten auch

+0

OP sagte 'Dies verursachte enormen Speicherverbrauch in Chrom in Hunderten von MBs und ich musste den Prozess beenden. ' – yurzui

+0

Woops, das ist meine schlechte – ZaksBack

Verwandte Themen