【问题标题】:Display multiple same values only once while others are looping using ngFor in Angular仅显示多个相同的值一次,而其他人在 Angular 中使用 ngFor 循环
【发布时间】:2020-10-26 13:05:06
【问题描述】:

我有以下来自服务器的示例数据集。

[
    {
        subMenuId: 1,
        submenu: 'Users',
        menu: 'Administration',
        url: '/pms/admin/usrs-dsh',
        icon: 'fas fa-cogs',
    },
    {
        subMenuId: 2,
        submenu: 'Roles',
        menu: 'Administration',
        url: '/pms/admin/roles-dsh',
        icon: 'fas fa-cogs',
    },
    {
        subMenuId: 3,
        submenu: 'Menu Items',
        menu: 'Administration',
        url: '/pms/admin/menus-dsh',
        icon: 'fas fa-cogs',
    },
    {
        subMenuId: 4,
        submenu: 'Banks',
        menu: 'Administration',
        url: '/pms/admin/banks-dsh',
        icon: 'fas fa-cogs',
    },
    {
        subMenuId: 5,
        submenu: 'Branches',
        menu: 'Administration',
        url: '/pms/admin/branches-dsh',
        icon: 'fas fa-cogs',
    },
    {
        subMenuId: 6,
        submenu: 'Dashboard',
        menu: 'PD3',
        url: '/pms/pd3/dsh',
        icon: 'fas fa-cogs',
    },

];

我想像这样显示这些数据。但目前在显示数据时,主级别值与每个子级别值重复。 预期输出

我的输出:

HTML 文件:

 <tr *ngFor="let m of userPermissions;">
                        <td>
                            <label class="ml-3 form-check-label">{{m.menu}}</label>
                        </td>
                        <td>
                            <div>
                                <input (change)="changeSubMenus($event, m.menu,m.subMenuId)" type="checkbox" class="ml-0 form-check-input">
                                <label class="ml-3 form-check-label">{{m.submenu}}</label><br>
                            </div>
                        </td>
                    </tr>

TS 文件:

getMenus(){
  this.userPermissions = this.adminService.allMenus;
  
  this.userPermissions.forEach((val) =>{
     // console.log(val)
     // TODO: remove multiple main level values and display sub level values with one main level value
  })

}

有什么办法可以做到这一点。 谢谢

【问题讨论】:

    标签: angular typescript ngfor angular10


    【解决方案1】:

    你需要修改数组中的对象来达到你想要的要求。您可以使用reduce 来实现,如下所示。

    你需要有一个像下面这样的对象结构,让事情变得更简单

    modifiedMenu = [{
      menu: < Main Menu 1 > ,
      subMenu: [ < submenu item > , < submenu item > , ...]
    }, {
      menu: < Main Menu 2 > ,
      subMenu: [ < submenu item > , < submenu item > , ...]
    }, ...]
    

    原来是这样的

    userPermissions = this.menus.reduce((acc, ele) => {
      if (acc.length === 0) {
        acc.push(this.getModifiedMainMenu(ele));
        return acc;
      } else {
        const existedMenu = acc.find(m => m.menu === ele.menu);
        if (existedMenu) {
          existedMenu.subMenu.push(this.getSubMenu(ele));
          return acc;
        } else {
          acc.push(this.getModifiedMainMenu(ele));
          return acc;
        }
      }
    }, []);
    
    getModifiedMainMenu(obj) {
      return {
        menu: obj.menu,
        subMenu: [this.getSubMenu(obj)]
      };
    }
    
    getSubMenu(obj) {
      return {
        menu: obj.menu,
        subMenuId: obj.subMenuId,
        submenu: obj.submenu,
        url: obj.url,
        icon: obj.icon
      };
    }
    

    在模板文件中,现在您需要 2 个ngFors 来循环主菜单项和相应的子菜单项,如下所示

    <tr *ngFor="let m of userPermissions;">
      <td>
        <label class="ml-3 form-check-label">{{m.menu}}</label>
      </td>
      <td>
        <div *ngFor="let subMenu of m.subMenu">
          <input (change)="changeSubMenus($event, subMenu.menu, subMenu.subMenuId)" type="checkbox" class="ml-0 form-check-input">
          <label class="ml-3 form-check-label">{{subMenu.submenu}}</label>
        </div>
      </td>
    </tr>
    

    工作Stackblitz

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2013-02-13
      • 2015-08-10
      • 2017-04-26
      相关资源
      最近更新 更多