2017-07-05 12 views
1

2つの配列を持つコンポーネントがあります。 arrayAおよびarrayBarrayBには、フィルタリングされた要素arrayAが含まれています。そして、テンプレートに:私はarrayBを更新するためにarrayAに対してフィルタメソッドを使用しdoSomething方法で角2:配列が更新されたときにビューが更新されない

<button (click)="doSomething()">Do Something</button> 

<div *ngFor="let elem of arrayB">{{elem.something}}</div> 

私もボタンがあります。

doSomething() { 
    this.arrayB = this.arrayA.filter(elem => { return ***some code***; }); 
} 

問題はビューが更新されないことです。 NgZone(ngZone.run():メソッドでコードをラップしました)とChangeDetectorRef(detectChanges()/ markForCheck():メソッドの最後にこれを呼び出しました)。

これを解決するにはどうすればよいですか?

+4

pls 'console.log(this.arrayB)'最後に 'doSomething' funcで実際に相違があるかどうかを確認 – Dhyey

+1

ボタンのクリックイベントが同じテンプレート内で発生した場合は、 ngForとして。あなたがAngularに伝える必要があるのは、それがチェンジツリーの外にあるか、チェックされた後に変更された場合だけです。たぶん、問題は、arrayBが変更する必要があると思ったときに変更されていないということです。 – cgTag

+0

@Dhyey 'console.log(arrayB)'で配列をチェックした後、私は奇妙なことに気付きました: 'doSomething()'が2回発生します。初めて 'arrayB'は正しい(フィルターにかけられました)が、2回目に...元のものです。私の '(クリック)'は次のようになります: '(クリック)=" foo &&!foo.bar && doSomething() "。だから私は問題がこれらの「条件」だと思う。 –

答えて

1

これは機能するはずです!あなたのフィルタが動作していることを確認して、この例を確認してください。

<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:私はtrueで返さdoSomething()方法で

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

ありがとうございます。フィルタはうまくいきますが、 'doSomething()'は(私が一度だけクリックしたとしても)2回発生します。初めて 'arrayB'は正しいですが、2度目は元のものです。問題は、なぜこの振る舞いであるかということです。 –

0

を。このため、この方法は2回発生しました。 解決策は常にfalseで返されます。

関連する問題