Angular 5 Material Многоуровневое меню SideNav в стиле карусели (без раскрывающегося списка)

Мне удалось сделать это на моей стороне с помощью Angular Material, он работал с подменю, которые были развернуты с раскрывающимися списками, но я ищу способ сделать их не «выпадающими», я ищу, чтобы они были похожи на вид перехода вправо, что-то вроде этого:

https://jmouriz.github.io/angular-material-multilevel-menu/demo/demo.html#!/demo/views/item-2

Но это сделано в AngularJS 1.X. Я использую Angular 5, кто-нибудь придумал какой-нибудь способ или с чего начать? Благодарю вас!


person S. A    schedule 11.12.2018    source источник
comment
Привет, SA, да, вы можете, следуйте этому material.angular.io/components/expansion/overview   -  person harkesh kumar    schedule 11.12.2018
comment
это поможет вам .... что сидеть вы хотите знать или как реализовать также   -  person harkesh kumar    schedule 11.12.2018
comment
Нет, мне нужен такой переход: i.gyazo.com/483af37c10ebd1a0eb53441213fc9ae5.gif Не выпадающий!   -  person S. A    schedule 11.12.2018
comment
затем вам нужно сделать свой собственный код javascript и логику с анимацией   -  person harkesh kumar    schedule 11.12.2018
comment
@harkeshfumar Можете ли вы помочь мне сделать это? У меня нет большого опыта работы с Angular, и я действительно хочу научиться!   -  person S. A    schedule 11.12.2018
comment
Я бы порекомендовал ознакомиться с руководством по угловой анимации. Вы всегда можете обрабатывать анимацию с помощью переходов css, но угловые анимации - гораздо лучший способ обработки переходов на основе состояний, подобных тому, что вы описали. angular.io/guide/animations   -  person Chris Newman    schedule 11.12.2018


Ответы (1)


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

  • Первоначальный подход заключался в том, чтобы управлять иерархией в основном из представления...
  • Это был неправильный подход.

Пересмотренный подход основан на концепции управления представлением на основе иерархии массивов... это обеспечивает гораздо более чистое решение с лучшей масштабируемостью.


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

rootTabs = [
    {
      id: 0,
      options: [
        { option: 'Home' },
        { option: 'Parámetros' },
        { option: 'Operativa' },
        { option: 'Productos' },
        { option: 'Invocación Servicios', rootTab: 1 }
      ]
    },
    {
      id: 1,
      options: [
        { option: 'Portal 1', rootTab: 2 },
        { option: 'Portal 2', rootTab: 4 },
        { option: 'Portal 3', rootTab: 5 }
      ]
    },
    {
      id: 2,
      options: [
        { option: 'Service 1 Item1', route: '/Submenu1' },
        { option: 'Service 1 Item2', route: '/Submenu2' },
        { option: 'Service 1 Item3', route: '/Submenu3' },
        { option: 'Service 1 Item4', route: '/Submenu4' },
        { option: 'Service 1 Item5', route: '/Submenu5' },
        { option: 'Invocación Servicios', rootTab: 3 }
      ]
    },
    {
      id: 3, options: [
        { option: 'put additional options here' }
      ]
    },
    {
      id: 4,
      options: [
        { option: 'Service 2 Item1', route: '/Submenu1' },
        { option: 'Service 2 Item2', route: '/Submenu2' },
        { option: 'Service 2 Item3', route: '/Submenu3' },
        { option: 'Service 2 Item4', route: '/Submenu4' },
        { option: 'Service 2 Item5', route: '/Submenu5' },
      ]
    },
    {
      id: 5,
      options: [
        { option: 'Service 3 Item1', route: '/Submenu1' },
        { option: 'Service 3 Item2', route: '/Submenu2' },
        { option: 'Service 3 Item3', route: '/Submenu3' },
        { option: 'Service 3 Item4', route: '/Submenu4' },
        { option: 'Service 3 Item5', route: '/Submenu5' },
      ]
    }
  ]

Создайте методы компонентов для обработки состояния меню посредством взаимодействия с пользовательским интерфейсом.

rootSelected(optionIndex, optionRootIndex, rootOption) {
    this.numItemsSelected++;
    this.previousRootTab = this.currentSelectedRootTab;
    this.currentSelectedRootTab = optionRootIndex;
    this.indexClicked = optionIndex;
    if (!this.breadcrumb1) {
      this.breadcrumb1 = rootOption
    } else if (!this.breadcrumb2) {
      this.breadcrumb2 = rootOption
    } else {
      this.breadcrumb3 = rootOption
    }
  }

  back2Main() {
    this.currentSelectedRootTab = 0;
    this.previousRootTab = 0;
    this.indexClicked = 0;

    this.numItemsSelected = 0;
    this.breadcrumb1 = null;
    this.breadcrumb2 = null;
    this.breadcrumb3 = null;
  }

  toBreadcrum1() {
    if (this.numItemsSelected > 1) {
      this.currentSelectedRootTab = this.breadcrumb1.rootTab;
      this.breadcrumb2 = null;
      this.numItemsSelected--
    }
  }

  toBreadcrum2() {
    if (this.numItemsSelected > 2) {
      this.currentSelectedRootTab = this.breadcrumb2.rootTab;
      this.breadcrumb3 = null;
      this.numItemsSelected--
    }
  }

Подключите все это в шаблоне

<div style="display: flex;flex-direction: row;margin:1% ;height:30px;">
    <div routerLink="/" routerLinkActive="active" (click)="back2Main()" style="cursor:pointer" class="vertical-align-text">Main</div>
    <div *ngIf="numItemsSelected >= 1">&nbsp;<mat-icon>chevron_right</mat-icon></div>
    <span *ngIf="numItemsSelected >= 1" routerLink="/" routerLinkActive="active" class="vertical-align-text" style="cursor:pointer;vertical-align: middle;" (click)="toBreadcrum1();">&nbsp;{{breadcrumb1.option}}</span>
    <div *ngIf="numItemsSelected >= 2">&nbsp;<mat-icon>chevron_right</mat-icon></div>
   <span *ngIf="numItemsSelected >= 2" routerLink="/" routerLinkActive="active" class="vertical-align-text" style="cursor:pointer" (click)="toBreadcrum2();">&nbsp;{{breadcrumb2.option}}</span>
    <div *ngIf="numItemsSelected >= 3">&nbsp;<mat-icon>chevron_right</mat-icon></div>
   <span *ngIf="numItemsSelected >= 3" routerLink="/" routerLinkActive="active" class="vertical-align-text" style="cursor:pointer" (click)="toBreadcrum3();">&nbsp;{{breadcrumb3.option}}</span>
   </div>


<div style="display: flex;flex-direction: row;background-color:white; height:100vh">
    <mat-tab-group class="navigation-tabs" [selectedIndex]="currentSelectedRootTab" dynamicHeight style="width:25vw; background-color:lightgray">
        <mat-tab *ngFor="let rootTab of rootTabs; let rootIndex = index" [label]="rootIndex">
            <mat-nav-list>
        <div *ngFor="let rootOption of rootTab.options; let optionIndex = index;">       
          <a mat-list-item *ngIf="!rootOption.rootTab" [routerLink]="rootOption.route" routerLinkActive="active">{{rootOption.option}}</a>
          <a mat-list-item style="width:100%" *ngIf="rootOption.rootTab" (click)="rootSelected(optionIndex, rootOption.rootTab, rootOption)">{{rootOption.option}}<div><mat-icon style="padding-left:20%;vertical-align: middle;">chevron_right</mat-icon></div></a>
        </div> 
            </mat-nav-list>
        </mat-tab>
    </mat-tab-group>
  <div style="margin:auto">
    <router-outlet></router-outlet> 
  </div>
</div>

Стэкблиц

https://stackblitz.com/edit/angular-x5xefi-gmzy46?embed=1&file=app/tab-group-basic-example.html

person Marshal    schedule 11.12.2018
comment
Это именно то, что я искал, я заканчиваю рефакторинг других вещей в своем приложении и буду пробовать. Благодарю вас! Есть ли в этом коде что-нибудь только версии 7? Потому что в проекте, над которым я работаю, используется Angular 5, следовательно, и Angular Material 5. Большое спасибо в том же духе! Так что для начала мне поможет, повернуть всегда можно, а это отлично. - person S. A; 12.12.2018
comment
Хм, я смотрю на код и вижу, что он на 100% ориентирован на вкладки, нельзя ли сделать так, чтобы они указывали на Router Link? так что вместо запуска currentSelectedRootTab это маршрутизируемый компонент? - person S. A; 12.12.2018
comment
Вот именно, извините, я не знал, как объясниться. - person S. A; 12.12.2018
comment
Большое спасибо, да, я знаю, как работает модуль маршрутизации. Позвольте мне объяснить: i.gyazo.com/f4599c1aa08e84cf37e6f64d8cb903e7.gif у меня есть sidenav, который имеет 4 роутинги которые не двигаются, это обычные мат-листы которые указывают прямо на какой-то маршрут, а вот маршрут 5 (тот что со значком молнии) я хочу сделать когда он активирован, это вкладка и при нажатии появляются 3 подменю вкладки, и если вы нажмете на любую из этих 3-х появившихся вкладок подменю; Вышло бы 5 вкладок (в каждой из этих 3-х вкладок) - person S. A; 12.12.2018
comment
Я думаю, что многое усложнил, объясняя, но это то, что я хочу сделать, и вы дали мне хороший толчок, чтобы начать! - person S. A; 12.12.2018
comment
Невероятно, вы только что сэкономили мне два дня попыток найти это решение. Единственное, чего я не знаю, так это как создать еще 5 вкладок при нажатии на Сервис 1, Сервис 2, Сервис 3. noreferrer">i.gyazo.com/1e1ee1105402f5ef313317f0acdf140b.gif - person S. A; 12.12.2018
comment
Спасибо! Действительно ценится. Я понял код, но, как вы говорите, я не могу найти способ, чтобы 5 вкладок также отображались в последних 2 сервисах :( Так близко, но так далеко хахаха - person S. A; 13.12.2018
comment
Я пытался сделать это из созданного вами stackblitz, а затем попытался вставить его в свой код, но, пытаясь это сделать, мне удалось умножить в нем только последние 5 вкладок до двух раз, мне не удалось получить пять в каждая вкладка ... :( правда в том, что я долго пытался, но не могу найти жизнеспособного решения - person S. A; 13.12.2018
comment
stackblitz.com/edit/angular-x5xefi-vdp13s Если вы нажмете на Portal 2, вы собирается увидеть это. Я совершенно вышел из-под контроля, после многих попыток я остался таким и решил остановиться, прежде чем повредить его еще больше. - person S. A; 13.12.2018
comment
Спасибо!! Изменить маршруты невозможно, верно? так как они названы как {{'/ Submenu' + ​​(itemIndex + 2)}} Это прекрасно, единственная деталь - это маршрут, который должен был бы помещать имена, которые там генерируются (SubmenuX), и что когда вы нажмите Сервис 1, 2 или 3 нет эффекта перехода как если бы это была вкладка, остальное идеально, на самом деле строка которая говорит поставить ваши новые 5 пунктов здесь не нужна, так как достаточно того что есть (Invocation Services›3 Опции› 5 опций на каждую опцию - person S. A; 13.12.2018
comment
Отлично, большое спасибо. И последнее: как я могу сделать, когда я нажимаю на Портал 1> Портал 2> Портал 3> (любой из трех вариантов) сделать переход с эффектом вкладок вместо того, чтобы просто перейти к следующему подменю без какого-либо эффекта ? - person S. A; 13.12.2018
comment
Пожалуйста, смотрите пересмотренный ответ - person Marshal; 14.12.2018
comment
Отлично, Вы дали гениальный подход. Намного более упорядоченно и интуитивно! Это было как раз то, что мне было нужно, большое спасибо. П.Д.: Могу ли я поместить матовые иконки в те же массивы, не повредив код? Только для корневых вкладок, а не для вложенных вкладок, которые входят внутрь. - person S. A; 14.12.2018
comment
Вы также знаете, как делать выпадающие списки? Чтобы в меню после выбора Портала 1, 2 или 3 было 2 возможных раскрывающихся списка (вместо 5 сервисов), с 5 ссылками внутри первого раскрывающегося списка и 3 ссылками во втором раскрывающемся списке. Поскольку, если я делаю все с вкладками, хлебных крошек становится слишком много, и это несколько сбивает пользователя с толку с таким количеством вкладок. - person S. A; 17.12.2018