問題は、 で関数バインディングを行っていることです[expanded]
。そのため、変更検出が実行されるたびに、shouldBeExpanded
関数が何度も繰り返されます。
オプション1:
shouldBeExpanded
[expanded] フラグを使い続けたい場合は、OnPush
変更検出戦略を使用できます。
これをテストしたところ、展開と折りたたみに少し問題がありました。デモでお試しください
TS:
import {Component, ChangeDetectionStrategy} from '@angular/core';
import {Http} from '@angular/http'
import {bootstrap} from '@angular/platform-browser-dynamic';
import 'rxjs/add/operator/map'
@Component({
selector: 'material-app',
templateUrl: 'app.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
プランカーのデモ
オプション 2:
関数でバインドする代わりに、展開ごとにフラグを追跡する配列を作成できます。OnInit
に格納されている値を使用して、配列を初期化できますlocalstorage
。値が localstorage にない場合は、デフォルト フラグを割り当てることができます。拡張状態が変化するたびに、配列と で更新しlocalstorage
ます。
TS:
export class AppComponent implements OnInt {
private version: any;
items = ["a1", "a2", "a3"];
expansionFlag = [];
constructor(http: Http) {
// Display the currently used Material 2 version.
this.version = http
.get('https://api.github.com/repos/angular/material2-builds/commits/HEAD')
.map(res => res.json())
}
ngOnInit(){
for(let i = 0; i <this.items.length; i++){
let flag = JSON.parse(localStorage.getItem(this.items[i]));
console.log(flag);
if(flag != undefined && flag != null){
this.expansionFlag.push(flag);
}
else
this.expansionFlag.push(false);
}
console.log(this.expansionFlag)
}
openPanel(name, index) {
console.log(name, 'is now open')
this.expansionFlag[index] = true;
localStorage.setItem(name, 'true');
}
closePanel(name, index) {
console.log(name, 'is now closed');
this.expansionFlag[index] = false;
localStorage.setItem(name, 'false');
}
}
[expanded]
html でそれぞれを更新します。
[expanded]="expansionFlag[0]"
[expanded]="expansionFlag[1]"
[expanded]="expansionFlag[2]"
プランカーのデモ