ngx-bootstrap выпадающие вложенные подменю в мобильном представлении - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь создать систему меню в Angular, которая поддерживает меню и подменю как с левой, так и с правой стороны, и хорошо выглядит в мобильном телефоне. Я смог добиться большего с ngx-bootstrap, я попробовал несколько других библиотек с небольшим успехом.

Проблема с кодом, который у меня есть, заключается в том, что в мобильном представлении он работает только частично, начальные меню выглядят прилично, но нажатие на меню по-прежнему создает всплывающее окно. Если я уберу некоторые из параметров container = "body", они будут работать нормально в мобильном телефоне, но не на рабочем столе.

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

menu.component.html

<nav class="navbar navbar-expand-sm">
<button class="navbar-toggler navbar-toggler-right nav-link" (click)="isCollapsed = !isCollapsed" aria-expanded="false" aria-label="Toggle navigation">
    <i class="fas fa-bars">Menu</i>
</button>
<div class="navbar-collapse collapse" container="body" [collapse]="isCollapsed" id="navbarNavDropdown">
    <ul class="navbar-nav col-md-12">
        <li *ngFor="let menu of leftItems" class="nav-item">
            <div *ngIf="!menu.items" container="body">
                <a *ngIf="!menu.items" class="nav-link" href="#">
                    <i *ngIf="menu.icon" class="{{ menu.icon }}"></i>{{ menu.label }}
                </a>
            </div>
            <div *ngIf="menu.items" class="navbar-collapse collapse" dropdown container="body" [collapse]="isCollapsed">
                <a class="nav-link dropdown-toggle" dropdownToggle (click)="false" href="#">
                    <i class="{{ menu.icon }}"></i>{{ menu.label }}
                </a>
                <ul *dropdownMenu class="dropdown-menu">
                    <ng-container  *ngFor="let item of menu.items">
                        <li *ngIf="!item.items" role="menuitem">
                            <a class="dropdown-item">
                                <i *ngIf="item.icon" class="{{ item.icon }}"></i>{{item.label}}
                            </a>
                        </li>
                        <li *ngIf="item.items" role="menuitem" dropdown triggers="mouseover" placement="top right" container="body">
                            <a class="dropdown-item" (click)="false">{{ item.label }}<i class="fas fa-caret-right dropdown-submenu"></i></a>
                            <ul *dropdownMenu class="dropdown-menu" role="menu">
                                <ng-container  *ngFor="let submenu of item.items">
                                    <li role="menuitem">
                                        <a class="dropdown-item" href="#">
                                            <i *ngIf="submenu.icon" class="{{ submenu.icon }}"></i>{{ submenu.label }}
                                        </a>
                                    </li>
                                    <li *ngIf="submenu.divider" class="divider dropdown-divider"></li>
                                </ng-container>
                            </ul>
                        </li>
                        <li *ngIf="item.divider" class="divider dropdown-divider"></li>
                    </ng-container>
                </ul>
            </div>
        </li>
        <li class="nav-item ml-auto"></li>
        <li *ngFor="let menu of rightItems" class="nav-item">
            <div *ngIf="!menu.items" container="body">
                <a *ngIf="!menu.items" class="nav-link" href="#">
                    <i *ngIf="menu.icon" class="{{ menu.icon }}"></i>{{ menu.label }}
                </a>
            </div>
            <div *ngIf="menu.items" dropdown container="body" placement="bottom right">
                <a class="nav-link dropdown-toggle" dropdownToggle (click)="false" href="#"><i class="{{ menu.icon }}"></i>{{ menu.label }}</a>
                <ul *dropdownMenu class="dropdown-menu dropdown-menu-right">
                    <ng-container  *ngFor="let item of menu.items">
                        <li *ngIf="!item.items" role="menuitem">
                            <a class="dropdown-item">
                                <i *ngIf="item.icon" class="{{ item.icon }}"></i>{{item.label}}
                            </a>
                        </li>
                        <li *ngIf="item.items" role="menuitem" dropdown triggers="mouseover" placement="top left" container="body">
                            <a class="dropdown-item" (click)="false"><i class="fas fa-caret-left dropdown-submenu-left"></i>{{ item.label }}</a>
                            <ul *dropdownMenu class="dropdown-menu dropdown-menu-right" role="menu">
                                <ng-container  *ngFor="let submenu of item.items">
                                    <li role="menuitem">
                                        <a class="dropdown-item" href="#">
                                            <i *ngIf="submenu.icon" class="{{ submenu.icon }}"></i>{{ submenu.label }}
                                        </a>
                                    </li>
                                    <li *ngIf="submenu.divider" class="divider dropdown-divider"></li>
                                </ng-container>
                            </ul>
                        </li>
                        <li *ngIf="item.divider" class="divider dropdown-divider"></li>
                    </ng-container>
                </ul>
            </div>
        </li>
    </ul>
</div>

menu.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
    selector: 'app-menu',
    templateUrl: './menu.component.html',
    styleUrls: ['./menu.component.scss'],
})
/**
 * Main Menu
 */

export class MenuComponent implements OnInit {
    leftItems: any[];
    rightItems: any[];
    isCollapsed = true;

    ngOnInit(): void {

        this.leftItems = [
        {
            label: 'Single Item',
            routerLink: '/single'
        },
        {
            label: 'Left Menu',
            icon: 'fas fa-puzzle-piece',
            items: [
                {label: 'Something', routerLink: '/something'
                },
                {label: 'Templates', routerLink: '/templates', divider: true},
                {label: 'Proposals', routerLink: '/props'},
                {label: 'Other Things', routerLink: '/other', divider: true},
                {label: 'Submneu', items: this.getDynamicMenu() },               
                {label: 'New Stuff', routerLink: '/new', icon: 'fas fa-plus'},                                                                                                          
                ]
            },
        ];

        this.rightItems = [
            {
                label: 'Help', icon: 'fas fa-life-ring',
                items: [
                    {label: 'Help Docs', items: [{label: 'Submenu Test'}]}
                ]
            }, {
                label: 'User', icon: 'fas fa-user',
                items: [
                    {label: 'Logout'}
                ]
            },]
    }

    getDynamicMenu() {
        const testNames = ['Test1', 'Test2', 'Test3'];
        const dynamicSubmenu = [];
        for(const menuName of testNames) {
            dynamicSubmenu.push({label: 'Submenu - ' + menuName, routerLink: '/submenus/' + menuName.toLowerCase()});
        }
        return dynamicSubmenu
    }
}

1 Ответ

0 голосов
/ 30 апреля 2019

Вы должны изменить направление размещения меню, вы не меняете направление размещения в мобильном представлении, поэтому его показ справки справа, попробуйте это, когда мобильное размещение = "низ", а на большом экране это точное размещение ="внизу справа" потребовалось время, чтобы выяснить, для размера экрана вы можете просмотреть эту тему Определить размер окна, используя Angular 4

этот медиа-запрос вступает в игру, когда размер экрана небольшой

@media (min-width: 576px)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...