Ich habe eine Komponente mit zwei Array. arrayA
und arrayB
. arrayB
enthält gefilterte Elemente von arrayA
. Und in der Vorlage:Angular 2: Ansicht aktualisiert nicht, wenn Array aktualisiert wird
<div *ngFor="let elem of arrayB">{{elem.something}}</div>
Ich habe einen Knopf zu:
<button (click)="doSomething()">Do Something</button>
In doSomething
Methode, die ich die Filter-Methode auf arrayA
arrayB
zu aktualisieren.
doSomething() {
this.arrayB = this.arrayA.filter(elem => { return ***some code***; });
}
Das Problem ist, dass die Ansicht nicht aktualisiert wird. Ich habe versucht, NgZone zu verwenden (ngZone.run(): Ich habe den Code in der Methode eingepackt.) Und ChangeDetectorRef (detectChanges()/markForCheck(): Ich habe dies am Ende der Methode aufgerufen.) Auch.
Was sollte die Lösung dafür sein?
pls 'console.log (this.arrayB)' endlich in 'doSomething' func und sehen, ob es tatsächlich irgendwelche Unterschiede gibt – Dhyey
Sie sollten nichts als geändert markieren müssen, wenn das Button-Klick-Ereignis innerhalb derselben Vorlage passiert als ngFor. Sie müssen Angular nur mitteilen, dass es sich geändert hat, wenn es sich außerhalb des Änderungsbaums befindet oder geändert wurde, nachdem es überprüft wurde. Vielleicht ist das Problem, dass ArrayB nicht geändert hat, als Sie dachten, dass es sollte. – cgTag
@Dhyey Nachdem ich das Array mit 'console.log (arrayB)' überprüft hatte, bemerkte ich eine seltsame Sache: Das 'doSomething()' wird zweimal ausgelöst. Das erste Mal ist das 'ArrayB' richtig (gefiltert), aber das zweite Mal ... es ist das Original. Mein '(click)' sieht so aus: '(click) =" foo &&! Foo.bar && doSomething() "'. Ich denke, die Probleme sind diese "Bedingungen". –