Понимание * ngFor от Angular 2 - PullRequest
       32

Понимание * ngFor от Angular 2

0 голосов
/ 28 августа 2018

Я пытаюсь использовать вложенный * ngFor в моем проекте Angular для рендеринга динамического меню. Я пытаюсь что-то вроде этого:

<li class="treeview" *ngFor="let pm of parentMenu">

    <a href="#">
      <i class="fa fa-edit"></i> <span>{{pm.MenuTitle}}</span>
      <span class="pull-right-container">
        <i class="fa fa-angle-left pull-right"></i>
      </span>
    </a>
    <ul class="treeview-menu" *ngFor="let cm of childMenu">
      <li *ngIf="cm.ParentMenuId == pm.Id">{{cm.MenuTitle}}</li>
    </ul>
  </li>

Я получаю только первый элемент childMenu, я понимаю, что * ng для работ, аналогичных foreach в C #, но ясно, что это не так. Может ли кто-нибудь помочь мне исправить код и понять его?

Ответы [ 5 ]

0 голосов
/ 28 августа 2018

Вы правы, что ngFor ведет себя как цикл foreach или for.

Я подозреваю, что ваша проблема в объекте, к которому вы привязываетесь.

используя в основном ваш код, в компоненте должно быть свойство с именем parentItem , которое представляет собой массив с вложенными свойствами, включая childMenu

parentMenu = {
    'Parent1':[{'menuTitle':'Menu 1', 'childItem':[
      {'menuTitle':'sub item 1'}]
      },
     {'menuTitle':'A cool menu', 'childItem':[
       {'menuTitle':'sub item 1'},
     {'menuTitle': 'sub item 2'}]
     }]
  }

и тогда ваш HTML должен работать примерно так:

<li class="treeview" *ngFor="let pm of parentMenu.Parent1">

    <a href="#">
      <i class="fa fa-edit"></i> <span>{{pm.menuTitle}}</span>
      <span class="pull-right-container">
        <i class="fa fa-angle-left pull-right"></i>
      </span>
    </a>
    <ul class="treeview-menu" *ngFor="let cm of pm.childItem">
      <li>{{cm.menuTitle}}</li>
    </ul>
  </li>

А для ссылки в действии на рабочий код стекаблиц:

0 голосов
/ 28 августа 2018
<ul>    
          <ng-template #recursiveMenu let-parentMenu>
             <li class="treeview" *ngFor="let pm of parentMenu">
               <a href="#">
                 <i class="fa fa-edit"></i> <span>{{pm.MenuTitle}}</span>
                 <span class="pull-right-container">
                   <i class="fa fa-angle-left pull-right"></i>
                  </span>
               </a>
               <ul class="treeview-menu">
                 <ng-container *ngTemplateOutlet="recursiveMenu; context:{ 
                   $implicit: pm.childMenu}">
                 </ng-container>
               </ul>
             </li>
          </ng-template>
          <ng-container *ngTemplateOutlet="recursiveMenu; context:{ 
            $implicit: parentMenu}">
          </ng-container>
</ul>
0 голосов
/ 28 августа 2018

Вы можете получить рекурсивное меню, используя шаблон, контейнеры или рекурсивный вызов компонента. Есть разные подходы, которым вы можете следовать.

Angular2 Меню навигации с рекурсивными шаблонами

Рекурсия по угловым компонентам

Угловой * ngДля шаблона дерева рекурсивных списков

0 голосов
/ 28 августа 2018

Я не знаю содержимого вашего .ts файла, но ваш код отлично работает у меня здесь:

https://stackblitz.com/edit/angular-sduuwm

Обратите внимание, что я определил свои массивы следующим образом:

  parentMenu = [
    {
      Id: 1,
      MenuTitle: "One",
    },
    {
      Id: 2,
      MenuTitle: "Two",
    },
    {
      Id: 3,
      MenuTitle: "Three",
    }
  ];

  childMenu = [
    { 
      ParentMenuId: 1,
      MenuTitle: "One quarter"
    },
    {
      ParentMenuId: 1,
      MenuTitle: "One half"
    },
    {
      ParentMenuId: 2,
      MenuTitle: "Two half"
    },
    {
      ParentMenuId: 3,
      MenuTitle: "Three half"
    }
  ];

Однако, тем не менее, если бы я был вами, я бы лучше определил свои массивы так:

  parentMenu = [
    {
      Id: 1,
      MenuTitle: "One",
      childMenu: [
        { MenuTitle: "One quarter" },
        { MenuTitle: "One half" },
      ]
    },
    {
      Id: 2,
      MenuTitle: "Two",
      childMenu: [
        { MenuTitle: "Two half" },
      ]
    },
    {
      Id: 3,
      MenuTitle: "Three",
      childMenu: [
        { MenuTitle: "Three half" },
      ]
    }
  ];

и сделайте HTML так:

<a href="#">
  <i class="fa fa-edit"></i> <span>{{pm.MenuTitle}}</span>
  <span class="pull-right-container">
    <i class="fa fa-angle-left pull-right"></i>
  </span>
</a>
<ul class="treeview-menu" *ngFor="let cm of pm.childMenu">
  <li>{{cm.MenuTitle}}</li>
</ul>

И вам не понадобится тест *ngIf в вашем коде.

0 голосов
/ 28 августа 2018

попробуйте этот код

 <ul class="treeview-menu" *ngFor="let cm of pm.childMenu">
      <li *ngIf="cm.ParentMenuId == pm.Id">{{cm.MenuTitle}}</li>
    </ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...