2017-07-05 6 views
1

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 arrayAarrayB 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?

+4

pls 'console.log (this.arrayB)' endlich in 'doSomething' func und sehen, ob es tatsächlich irgendwelche Unterschiede gibt – Dhyey

+1

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

+0

@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". –

Antwort

1

Es sollte funktionieren! stellen Sie sicher, dass Ihr Filter funktioniert, überprüfen Sie bitte folgendes Beispiel:

<div *ngFor="let elemB of arrayB">{{elemB}}</div> 
<strong>array A :</strong> 
<div *ngFor="let elemA of arrayA">{{elemA}}</div> 
<button (click)="doSomething()">Do Something</button> 

TS:

arrayA = [0,1,2,3,4]; 
arrayB = []; 

doSomething(){ 
    this.arrayB = this.arrayA.filter(x => { return x > 2; }); 
} 

https://plnkr.co/edit/VQYoVIGoioPwjW1ThcFQ?p=preview

+0

Vielen Dank für Ihre Antwort. Es stellt sich heraus, dass der Filter in Ordnung ist, aber 'doSomething()' wird zweimal ausgelöst (auch wenn ich nur einmal geklickt habe). Das erste Mal ist das 'ArrayB' richtig, aber das zweite Mal ist es das Original. Die Frage ist, warum ist dieses Verhalten. –

0

Im doSomething() Methode, die ich mit true zurückgegeben. Aus diesem Grund hat die Methode zweimal ausgelöst. Also die Lösung ist immer mit false zurückzukehren.

Verwandte Themen