离子菜单项在选择一个时全部处于活动状态

问题描述 投票:0回答:1

我有一个基于用户访问权限的应用程序。我检查用户所处的环境以及他们在该环境中可以访问哪些功能,然后,我将这些功能列为菜单中的导航项。

最初,我的菜单将有两个项目,一个指向“主”屏幕的导航链接和一个使用户退出应用程序的按钮。其他项目(导航链接)是动态加载的。这些项目可以是主要项目,也可以有“子项”。

应用程序启动时,用户将被重定向到主屏幕,并加载其访问列表。但是,当我选择要导航的项目时,我的所有项目都将被选择(它们都接收“menu-item-active”类),并且它们的“href”值将更改为所选项目的链接。为什么会发生这种情况,我该如何解决?请帮忙!!! ;(

menu.component.html:

<ion-menu type="overlay" [contentId]="contentId">
  <ion-header>
    <ion-toolbar>
      <ion-menu-button slot="start">
        <ion-icon name="close-outline"></ion-icon>
      </ion-menu-button>
      <ion-title>MENU</ion-title>
    </ion-toolbar>
  </ion-header>

  <ion-content>
    <ion-list class="ion-padding">
      <a routerLink="home"
         [routerLinkActive]="'menu-item-active'"
         [routerLinkActiveOptions]="{ exact: true }"
         class="menu-item"
         (click)="closeMenu()">
          <mat-icon>home</mat-icon>
          <ion-label>Home</ion-label>
      </a>

      <ng-container *ngFor="let item of navigationItems">
        <ng-container *ngIf="item.type === 'basic'">
          <a [routerLink]="item.link"
             [routerLinkActive]="'menu-item-active'"
             [routerLinkActiveOptions]="{ exact: true }"
             class="menu-item"
             (click)="closeMenu()">
              <mat-icon>{{ item.icon }}</mat-icon>
              <ion-label>{{ item.title }}</ion-label>
          </a>
        </ng-container>

        <ng-container *ngIf="item.type === 'collapsable'">
          <ion-accordion-group>
            <ion-accordion>
              <ion-item slot="header" class="menu-item-header">
                <mat-icon class="menu-item-header-icon">{{ item.icon }}</mat-icon>
                <ion-label>{{ item.title }}</ion-label>
              </ion-item>

              <div slot="content">
                <ion-list *ngIf="item.children && item.children.length > 0">
                  <a *ngFor="let child of item.children"
                     [routerLink]="child.link"
                     [routerLinkActive]="'menu-item-active'"
                     [routerLinkActiveOptions]="{ exact: true }"
                     class="menu-item"
                     (click)="closeMenu()">
                      <mat-icon>{{ child.icon }}</mat-icon>
                      <ion-label>{{ child.title }}</ion-label>
                  </a>
                </ion-list>
              </div>
            </ion-accordion>
          </ion-accordion-group>
        </ng-container>
      </ng-container>

      <ion-button class="logout-button" fill="clear" (click)="onLogout()">
        <span class="logout-button-content">
          <ion-icon name="log-out-outline"></ion-icon>
          <ion-label>Sair</ion-label>
        </span>
      </ion-button>
    </ion-list>
  </ion-content>

  <ion-footer>
    <ion-item>footer</ion-item>
  </ion-footer>
</ion-menu>

menu.component.ts:

import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { Subject, takeUntil } from 'rxjs';
import { AuthService } from 'src/app/core/auth/auth.service';
import { MenuNavigationItem } from './menu.model';
import { UserAccessService } from 'src/app/core/user-access/user-access.service';
import { Functionality } from 'src/app/core/auth/auth.model';
import { MenuController } from '@ionic/angular';

@Component({
  selector: 'app-menu',
  templateUrl: './menu.component.html',
  styleUrls: ['./menu.component.scss'],
})
export class MenuComponent implements OnInit, OnDestroy {
  private _unsubscribeAll: Subject<any> = new Subject<any>();

  @Input() contentId: string;

  public navigationItems: MenuNavigationItem[] = [];

  constructor(
    private _authService: AuthService,
    private _userAccessService: UserAccessService,
    private _menuController: MenuController
  ) { }

  private verifyUserAccessInEnvironment(funccionalities: Functionality[]): boolean {
    return funccionalities.length === 0 ? false : true;
  }

  private fillNavigationItems(): void {
    let filteredFuncionalities: Functionality[] = [];

    this._userAccessService.getFilteredFuncionalitiesIds()
      .then((functionalities: Functionality[]) => {

        filteredFuncionalities = functionalities;
        this.navigationItems = this._userAccessService.getPowerBiFunctionalitiesNavigation(filteredFuncionalities);
        this._userAccessService.hasPowerBiAccessInCurrentEnvironment
          .next(this.verifyUserAccessInEnvironment(functionalities));
      });
  }

  ngOnInit(): void {
    this._userAccessService.currentEnvironmentId
      .pipe(takeUntil(this._unsubscribeAll))
      .subscribe(() => {
        this.fillNavigationItems();
      });
  }

  closeMenu(): void {
    this._menuController.close();
  }

  onLogout(): void {
    this._authService.logout();
  }

  ngOnDestroy(): void {
    this._unsubscribeAll.next(null);
    this._unsubscribeAll.complete();
  }

}

以下是加载导航项目的示例:

[
    {
        "id": "703",
        "title": "ITEM 1",
        "type": "collapsable",
        "icon": "business",
        "children": [
            {
                "id": "778",
                "title": "ITEM 1.1",
                "type": "basic",
                "icon": "",
                "link": "item/778",
                "children": []
            },
            {
                "id": "838",
                "title": "ITEM 1.2",
                "type": "basic",
                "icon": "",
                "link": "item/838",
                "children": []
            },
            {
                "id": "751",
                "title": "ITEM 1.3",
                "type": "basic",
                "icon": "",
                "link": "item/751",
                "children": []
            }
        ]
    },
    {
        "id": "701",
        "title": "ITEM 2",
        "type": "collapsable",
        "icon": "pets",
        "children": [
            {
                "id": "813",
                "title": "ITEM 2.1",
                "type": "basic",
                "icon": "",
                "link": "item/813",
                "children": []
            },
            {
                "id": "810",
                "title": "ITEM 2.2",
                "type": "basic",
                "icon": "",
                "link": "item/810",
                "children": []
            }
        ]
    }
]

编辑1:由于每当选择一个项目时都会调用“closeMenu()”方法,因此我在其中调用了“fillNavigationItems()”方法并添加了一个“console.log(this.navigationItems);”这些项目都是正确的,有各自的链接。但是,由于某种原因,当我检查浏览器的开发人员工具中的每个项目时,所有项目都有“menu-item-active”类和带有最后选定项目值的“href”。

angular ionic-framework navigation ion-menu
1个回答
0
投票

我不知道为什么这是解决方案,但它解决了我的问题。

我刚刚在我的 routerLinks 值中添加了一个“/”,如下所示:

routerLink="home"
[routerLink]="'/' + item.link"
[routerLink]="'/' + child.link"
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.