Angular Material 标签包装器 - 添加新标签不会反映在 UI
Angular Material Tabs Wrapper - Adding new tab doesn't reflect in UI
我正在尝试围绕 MatTabs
创建一个包装器,它公开了 MatTabs
的所有属性并遇到了这个问题:
。
我向其中添加了其他选项卡属性和事件。
事件似乎正确触发。
当我添加新的 tab.The 数组时出现问题,但 UI 保持不变。
HTML
<div>
<span class="example-input-label"> Selected tab index: </span>
<mat-form-field>
<input matInput type="number" [formControl]="selected">
</mat-form-field>
</div>
<div>
<button mat-raised-button
class="example-add-tab-button"
(click)="addTab(selectAfterAdding.checked)">
ADD NEW TAB
<br/>
</button>
<mat-checkbox #selectAfterAdding> Select tab after adding </mat-checkbox>
</div>
<custom-tabs [selectedIndex]="selected.value"
(sqSelectedIndexChange)="selected.setValue($event)">
<custom-tab *ngFor="let tab of tabs; let index = index" [label]="tab">
Contents for {{tab}} tab
<button mat-raised-button
class="example-delete-tab-button"
[disabled]="tabs.length === 1"
(click)="removeTab(index)">
Delete Tab
<br/>
</button>
</custom-tab>
</custom-tabs>
TS
tabs = ['First', 'Second', 'Third'];
selected = new FormControl(0);
addTab(selectAfterAdding: boolean) {
this.tabs.push('New');
console.log(this.tabs);
if (selectAfterAdding) {
this.selected.setValue(this.tabs.length - 1);
}
}
removeTab(index: number) {
this.tabs.splice(index, 1);
}
理想情况下,我希望公开 MatTabs
提供的所有开箱即用的功能,然后再公开一些。
因此,未加载选项卡的原因是自定义选项卡组件的 ngViewAfterInit()
函数中的代码。它已被初始化,仅此而已。因此 this.tabGroup
永远不会更新当前选项卡,因此不会反映在 UI 中。所以我添加了一个订阅来监视选项卡何时更改,并使用相同的逻辑(我不确定这是否 100% 正确,但它完成了工作)。
public ngAfterViewInit() {
const matTabsFromQueryList = this.tabs.map((tab) => tab.matTab);
const list = new QueryList<MatTab>();
list.reset([matTabsFromQueryList]);
this.tabGroup._tabs = list;
this.tabGroup.ngAfterContentInit();
// watches for when the tabs change
this.tabs.changes.subscribe(value => {
const matTabsFromQueryList = value.map((tab) => tab.matTab);
const list = new QueryList<MatTab>();
list.reset([matTabsFromQueryList]);
this.tabGroup._tabs = list;
this.tabGroup.ngAfterContentInit();
});
}
这(再次)不是最优雅的解决方案,因为您需要在选项卡加载之前与它们进行交互,但它保留了上下文(如输入框所示)。如果不选择不同的选项卡,选项卡不会更新,所以我不得不做一个 hacky 解决方案,我将 this.selected.value 切换到 -1 然后切换回正确的选项卡,所以它有点难看但至少它有效。
我正在尝试围绕 MatTabs
创建一个包装器,它公开了 MatTabs
的所有属性并遇到了这个问题:
当我添加新的 tab.The 数组时出现问题,但 UI 保持不变。
HTML
<div>
<span class="example-input-label"> Selected tab index: </span>
<mat-form-field>
<input matInput type="number" [formControl]="selected">
</mat-form-field>
</div>
<div>
<button mat-raised-button
class="example-add-tab-button"
(click)="addTab(selectAfterAdding.checked)">
ADD NEW TAB
<br/>
</button>
<mat-checkbox #selectAfterAdding> Select tab after adding </mat-checkbox>
</div>
<custom-tabs [selectedIndex]="selected.value"
(sqSelectedIndexChange)="selected.setValue($event)">
<custom-tab *ngFor="let tab of tabs; let index = index" [label]="tab">
Contents for {{tab}} tab
<button mat-raised-button
class="example-delete-tab-button"
[disabled]="tabs.length === 1"
(click)="removeTab(index)">
Delete Tab
<br/>
</button>
</custom-tab>
</custom-tabs>
TS
tabs = ['First', 'Second', 'Third'];
selected = new FormControl(0);
addTab(selectAfterAdding: boolean) {
this.tabs.push('New');
console.log(this.tabs);
if (selectAfterAdding) {
this.selected.setValue(this.tabs.length - 1);
}
}
removeTab(index: number) {
this.tabs.splice(index, 1);
}
理想情况下,我希望公开 MatTabs
提供的所有开箱即用的功能,然后再公开一些。
因此,未加载选项卡的原因是自定义选项卡组件的 ngViewAfterInit()
函数中的代码。它已被初始化,仅此而已。因此 this.tabGroup
永远不会更新当前选项卡,因此不会反映在 UI 中。所以我添加了一个订阅来监视选项卡何时更改,并使用相同的逻辑(我不确定这是否 100% 正确,但它完成了工作)。
public ngAfterViewInit() {
const matTabsFromQueryList = this.tabs.map((tab) => tab.matTab);
const list = new QueryList<MatTab>();
list.reset([matTabsFromQueryList]);
this.tabGroup._tabs = list;
this.tabGroup.ngAfterContentInit();
// watches for when the tabs change
this.tabs.changes.subscribe(value => {
const matTabsFromQueryList = value.map((tab) => tab.matTab);
const list = new QueryList<MatTab>();
list.reset([matTabsFromQueryList]);
this.tabGroup._tabs = list;
this.tabGroup.ngAfterContentInit();
});
}
这(再次)不是最优雅的解决方案,因为您需要在选项卡加载之前与它们进行交互,但它保留了上下文(如输入框所示)。如果不选择不同的选项卡,选项卡不会更新,所以我不得不做一个 hacky 解决方案,我将 this.selected.value 切换到 -1 然后切换回正确的选项卡,所以它有点难看但至少它有效。