ng-bootstrap: accordion 重新初始化组件
ng-bootstrap: accordion reinitializes component
我在 ng-bootstrap 中使用 ngb-accordion。切换 header 会导致其 child 组件重新初始化。例如,切换 headers 会导致下拉菜单重置。好像是因为<div class="card-block"></div>
在面板隐藏的时候被删除了
如何保持组件的状态,即使它们在手风琴中 "hidden"?
模板文件:
<ngb-accordion activeIds="side-bar-accordion-1" (panelChange)="beforeChange($event)">
<div [class.hide-card-block]="status">
<ngb-panel id="side-bar-accordion-1" class="foo">
<template ngbPanelTitle>
<div class="title">Axes</div>
</template>
<template ngbPanelContent>
<!--This is the component whose state I want to maintain:-->
<side-bar-axes></side-bar-axes>
</template>
</ngb-panel>
</div>
<ngb-panel id="side-bar-accordion-2">
<template ngbPanelTitle>
<div class="title">Fancy</div>
</template>
<template ngbPanelContent>
blah blah
</template>
</ngb-panel>
<ngb-panel id="side-bar-accordion-3">
<template ngbPanelTitle>
<div class="title">Settings</div>
</template>
<template ngbPanelContent>
blah blah
</template>
</ngb-panel>
</ngb-accordion>
组件 TypeScript 文件:
import { Component, ViewChildren, ViewEncapsulation } from '@angular/core';
import { NgbPanelChangeEvent } from '@ng-bootstrap/ng-bootstrap';
import { FieldChooseFiltersComponent } from '../field-choose-filters/field-choose-filters.component';
@Component({
moduleId: module.id,
selector: 'side-bar',
templateUrl: 'side-bar.component.html',
styleUrls: ['side-bar.component.css'],
encapsulation: ViewEncapsulation.None
})
export class SideBarComponent {
hideNum: number = 1;
status: boolean = false;
toggleStatus() {
this.status = !this.status;
}
public beforeChange($event: NgbPanelChangeEvent) {
if ($event.panelId === '1' && $event.nextState === false) {
$event.preventDefault();
}
if ($event.panelId === '2' && $event.nextState === false) {
$event.preventDefault();
}
if ($event.panelId === '3' && $event.nextState === false) {
$event.preventDefault();
}
};
}
https://ng-bootstrap.github.io/#/components/accordion 的当前实施假定只有活动(可见)面板 shell 保留在 DOM 中。这是一个有意识的设计决定,因为保留不可见的面板意味着:
- 他们的内容即使从未显示也会被初始化
- Angular 将不得不 运行 更改对不可见且不会增加最终用户体验的部分的检测。
因此,目前一切正常。如果您想在打开/关闭面板时保留状态,一个选项是将相关状态移动到父组件之一。
如果社区有足够的兴趣,我们可能会添加一个选项,以便在面板关闭时不销毁面板的内容。
NgbAccordion
有输入选项 destroyOnHide
。它必须是假的。查看文档 here。
示例:<ngb-accordion [destroyOnHide]="false">
我在 ng-bootstrap 中使用 ngb-accordion。切换 header 会导致其 child 组件重新初始化。例如,切换 headers 会导致下拉菜单重置。好像是因为<div class="card-block"></div>
在面板隐藏的时候被删除了
如何保持组件的状态,即使它们在手风琴中 "hidden"?
模板文件:
<ngb-accordion activeIds="side-bar-accordion-1" (panelChange)="beforeChange($event)">
<div [class.hide-card-block]="status">
<ngb-panel id="side-bar-accordion-1" class="foo">
<template ngbPanelTitle>
<div class="title">Axes</div>
</template>
<template ngbPanelContent>
<!--This is the component whose state I want to maintain:-->
<side-bar-axes></side-bar-axes>
</template>
</ngb-panel>
</div>
<ngb-panel id="side-bar-accordion-2">
<template ngbPanelTitle>
<div class="title">Fancy</div>
</template>
<template ngbPanelContent>
blah blah
</template>
</ngb-panel>
<ngb-panel id="side-bar-accordion-3">
<template ngbPanelTitle>
<div class="title">Settings</div>
</template>
<template ngbPanelContent>
blah blah
</template>
</ngb-panel>
</ngb-accordion>
组件 TypeScript 文件:
import { Component, ViewChildren, ViewEncapsulation } from '@angular/core';
import { NgbPanelChangeEvent } from '@ng-bootstrap/ng-bootstrap';
import { FieldChooseFiltersComponent } from '../field-choose-filters/field-choose-filters.component';
@Component({
moduleId: module.id,
selector: 'side-bar',
templateUrl: 'side-bar.component.html',
styleUrls: ['side-bar.component.css'],
encapsulation: ViewEncapsulation.None
})
export class SideBarComponent {
hideNum: number = 1;
status: boolean = false;
toggleStatus() {
this.status = !this.status;
}
public beforeChange($event: NgbPanelChangeEvent) {
if ($event.panelId === '1' && $event.nextState === false) {
$event.preventDefault();
}
if ($event.panelId === '2' && $event.nextState === false) {
$event.preventDefault();
}
if ($event.panelId === '3' && $event.nextState === false) {
$event.preventDefault();
}
};
}
https://ng-bootstrap.github.io/#/components/accordion 的当前实施假定只有活动(可见)面板 shell 保留在 DOM 中。这是一个有意识的设计决定,因为保留不可见的面板意味着:
- 他们的内容即使从未显示也会被初始化
- Angular 将不得不 运行 更改对不可见且不会增加最终用户体验的部分的检测。
因此,目前一切正常。如果您想在打开/关闭面板时保留状态,一个选项是将相关状态移动到父组件之一。
如果社区有足够的兴趣,我们可能会添加一个选项,以便在面板关闭时不销毁面板的内容。
NgbAccordion
有输入选项 destroyOnHide
。它必须是假的。查看文档 here。
示例:<ngb-accordion [destroyOnHide]="false">