Динамический меню на Angular 7

136
30 сентября 2019, 03:30

Передо мной вот такая задача создать динамический меню на Angular 7. У меня вот такой JSON

{
  "menu": [
    {"id": "1", "parent_id": null, "url": "who-we-are", "desc": "Who we are"},
    {"id": "2", "parent_id": "1", "url": "our-mission", "desc": "Our mission"},
    {"id": "3", "parent_id": "1", "url": "our-history", "desc": "Our History"},
    {"id": "4", "parent_id": "1", "url": "leadership", "desc": "Leadership"},
    {"id": "5", "parent_id": "1", "url": "members", "desc": "Members"},
    {"id": "6", "parent_id": "1", "url": "join-aahpo", "desc": "Join AAHPO"},
    {"id": "7", "parent_id": "6", "url": "members", "desc": "Become a member"},
    {"id": "8", "parent_id": "6", "url": "renew-your-membership", "desc": "Renew your membership"},
    {"id": "9", "parent_id": "7", "url": "pay-your-dues", "desc": "Pay your dues"},
    {"id": "10", "parent_id": "8", "url": "renew-your-membership", "desc": "Pay your dues"},
    {"id": "11", "parent_id": "1", "url": "faqs", "desc": "FAQs"},
    {"id": "12", "parent_id": "1", "url": "contact-us", "desc": "Contact Us"},
    {"id": "13", "parent_id": "1", "url": "partnerships", "desc": "Partnerships"},
  ]
}

Обработаю его с помощью рекурсивной функции

menuPush(content, pid = null) {
    let menu = [];
    for (let i = 0; i < content.length; i++) {
      if (content[i]['parent_id'] === pid) {
        menu.push({
          id: content[i]['id'],
          url: content[i]['url'],
          desc: content[i]['desc'],
          dropdown: this.menuPush(content, content[i]['id'])
        });
      }
    }
    return menu;
  }

А вот html

<ul class="rd-navbar-nav">
  <li routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}"><a routerLink="/who-we-are">Who we are</a>
    <!--RD Navbar Dropdown-->
    <ul class="rd-navbar-dropdown">
      <li><a routerLink="/members">Members</a></li>
      <li>
        <a routerLink="/join-aahpo">Join AAHPO</a>
        <!-- RD Navbar Dropdown -->
        <ul class="rd-navbar-dropdown">
          <li>
            <a routerLink="/become-a-member">Become a member</a>
            <ul class="rd-navbar-dropdown">
              <li>
                <a routerLink="/pay-your-dues">Pay your dues</a>
              </li>
            </ul>
          </li>
        </ul>
        <!-- END RD Navbar Dropdown -->
      </li>
      <li><a routerLink="/partnerships">Partnerships</a></li>
    </ul>
    <!--END RD Navbar Dropdown-->
  </li>
</ul>

Проблема в том что я не знаю сколько будет длина и сколько parent в одном меню. Можете помочь в написании.

Answer 1

Я набросал небольшой пример.

Самое главное что вам надо сделать, вызывать компонент внутри себя. Как рекурсия в функции - то же самое.

<ul>
  <ng-container *ngFor="let item of menu">
    <li>{{item.desc}}</li>
    <li *ngIf="item.dropdown.length">
      <my-menu [menu]="item.dropdown"></my-menu>
    </li>
  </ng-container>
</ul>
READ ALSO
Как повернуть маркер в leaflet js?

Как повернуть маркер в leaflet js?

подскажите как повернуть маркер в leaflet js в зависимости от стартовой точки и конечной точки? Использую ext js

111
JS, Vue.js определение формы

JS, Vue.js определение формы

Допустим у меня есть многомерный массив с новостями который приходит с сервера:

115
Функции как методы в JavaScript

Функции как методы в JavaScript

Можно ли использовать функцию как метод в js? Например есть функция stop

121
Как получить значение с объекта и сравнить его

Как получить значение с объекта и сравнить его

на странице имеется список input[type=radio], всего их 10 штук у каждого три варианта ответаКак с помощью js или jquery получить значение каждого из инпутов...

116