我設法解決這個問題用一個指令
import { Directive, Optional, Input, HostListener, Output, EventEmitter } from '@angular/core';
import { MatExpansionPanel } from '@angular/material';
@Directive({selector: '[ngtExpansionPanelToggle]'})
export class ExpansionPanelToggleDirective {
@Input()
set isExpanded(state: boolean) {
this.setIsExpanded(state);
};
@Output() onToggle: EventEmitter<boolean> = new EventEmitter<boolean>();
constructor(@Optional() private _matExpansionPanel: MatExpansionPanel) {
}
@HostListener('click', ['$event'])
togglePanel(event) {
setTimeout(() => {
this.onToggle.emit(this.getExpandedState());
}, 0);
}
private setIsExpanded(state: boolean) {
if (!this._matExpansionPanel) {
return;
}
let panelState = this._matExpansionPanel._getExpandedState();
let newState = this.toPanelState(state);
if (newState === panelState) {
return;
}
this._matExpansionPanel.toggle();
}
private toPanelState(state: boolean) {
return state
? 'expanded'
: 'collapsed';
}
private getExpandedState(): boolean {
let panelState = this._matExpansionPanel._getExpandedState()
if (panelState === 'expanded') {
return true;
}
return false;
}
}
而且我重視這個指令的HTML這樣
<mat-expansion-panel>
<mat-expansion-panel-header ngtExpansionPanelToggle
[isExpanded]="rowConfig?.isPanelOpened"
(onToggle)="handleTogglePanel(rowConfig, $event)">
<mat-panel-title class="ngt-group-title">
{{rowConfig.title}}
</mat-panel-title>
<mat-panel-description class="ngt-group-description">
{{rowConfig.description}}
</mat-panel-description>
</mat-expansion-panel-header>
<ngt-form-elements *ngFor="let rowElements of rowConfig.elements"
[formName]="formStaticConfig.name"
[parentFormGroup]="ngFormGroup"
[outsideDataProviders]="outsideDataProviders"
[elements]="rowElements.elementsOnLine">
</ngt-form-elements>
</mat-expansion-panel>
所以如果面板狀態使用瀏覽器事件更新,我不會 rerendere視圖,否則將從配置呈現。