Я не полностью знаю, как настроена ваша система, но Я собрал стек , который показывает, как динамически изменять вкладки при изменении пользователя.
КакВы обнаружили, что Ionic на самом деле не работает правильно, если вы измените фактические вкладки, которые отображаются в нем.Что вы можете сделать, это динамически показать / скрыть их, используя свойство [show]
.
<ion-tabs #ionTabs>
<ion-tab *ngFor="let tab of tabs$ | async; trackBy: trackByFn"
[tabIcon]="tab.icon"
[tabTitle]="tab.label"
[root]="tab.component"
[show]="tab.show">
</ion-tab>
</ion-tabs>
Я собрал все вкладки в массив и дал список ролей, которые имеют доступ к каждой из них.
export const TABS: TabInterface[] = [
{ label: 'Home', icon: 'home', component: HomePage, roles: [UserRole.Admin], show: false },
{ label: 'About', icon: 'information-circle', component: AboutPage, roles: [UserRole.Admin, UserRole.Teacher], show: false },
{ label: 'Contact', icon: 'contacts', component: ContactPage, roles: [UserRole.Teacher, UserRole.Student], show: false }
];
Затем, когда пользователь изменился, я обработал вкладки, чтобы определить, к какому пользователю он имел доступ, исходя из ролей, которые у него были:
tabs$ = this.userService.user$
.takeUntil(this.destroy$.asObservable())
.map(user => this.processTabsForUser(user))
.do(tabs => this.selectCorrectTab(tabs));
...
private processTabsForUser(user: User): TabInterface[] {
return TABS.map(tab => {
return Object.assign({}, tab, { show: user && user.isAuthorized(tab.roles)});
});
}
Для правильной работы, еслиПользователь изменился, когда вошел другой (что не должно происходить в реальной системе, я бы не подумал, но ...) Мне пришлось обработать текущую выбранную вкладку и убедиться, что пользователь имеет к ней доступ.Если нет, я бы выбрал первую вкладку, к которой у пользователя был доступ:
private selectCorrectTab(tabs: TabInterface[]) {
const selectedTab = this.ionTabs.getSelected();
const tab = tabs.find(t => selectedTab && t.component === selectedTab.root);
if (!tab || !tab.show) {
const index = tabs.findIndex(t => t.show);
if (!!~index) {
// bug in Ionic causes the need to do in setTimeout if user changes when already logged in
setTimeout(() => this.ionTabs.select(index));
}
}
}
Это должно привести к конечному результату динамического изменения вкладок в зависимости от пользователя, вошедшего в систему.