【问题标题】:How do I use a router and inbuilt/custom attributes to create dropdown menu in aurelia?如何使用路由器和内置/自定义属性在 aurelia 中创建下拉菜单?
【发布时间】:2015-12-28 01:21:28
【问题描述】:

Twitter bootstrap 有一个下拉菜单选项;菜单有多层。见:http://getbootstrap.com/javascript/#dropdowns

如何使用 Aurelia.js 的路由器重新创建它?路由器通常提供 1 级。我需要 2 个级别。

【问题讨论】:

  • 这是为了让路由器为您提供一个数组或其他结构,以允许您生成菜单的方式定义可导航路线?否则,路由器实际上并不关心您在 UI 中使用多少菜单级别来呈现选择,并且可以处理任意数量的级别。我不想回答 Aurelia,因为我仍然使用 Durandal。我相信 Aurelia 具有 nav:true 属性,就像 Durandal 所做的那样,可以轻松获取可导航路线的列表。
  • @joshp 你是对的,你的主要观点是我要问的问题。属性:'nav' 仅用于显示或隐藏,与问题本身无关。
  • nav: 在排除根本不应该出现的路线的意义上是相关的,但它没有说明层次结构。但我从没想过路由器会提供表示层次结构。我在需要时提供,我从不希望路由器知道它。我重用了许多地方的路由,并且我没有将路由器视为菜单层次结构。我尽量保持路线简洁。所以你的问题让我很感兴趣,一种不同的思维方式。
  • 我不喜欢答案中的建议。我不确定这是否会跟踪子菜单的活动路线。我在另一篇有类似问题的帖子中解释了我的解决方法。 stackoverflow.com/questions/37217227/…

标签: javascript mvvm drop-down-menu aurelia


【解决方案1】:

归功于:https://github.com/adarshpastakia

我“借用”了这个人的大部分代码来回答这个问题。您可以在以下位置找到它:https://gist.github.com/adarshpastakia/5d8462b5bc8d958d5cb3

以下是回答上述问题的步骤:
(1) 在路由器中,添加一个“设置”属性。它可以是你想要的任何东西。下面是一个例子:
settings:{ subMenu:[ {href:'#/sub1', title:'Submenu 1'}, {href:'zoldello.wordpress.com', title:'Submenu 2'}, {href:'#/sub3', title:'Submenu 3'} ] }

注意:(a)必须叫“settings”(b)Aurelia目前会忽略你在“settings”之外写的自定义代码(c)在“settings”里,你可以在里面放任何你喜欢的属性

(2)
(a) 从上面的 (1) 开始,如果您需要子菜单路由到页面的一部分,请在 href(或您所称的任何名称)中使用“#sub1”;其中“sub1”指的是不同的路线,其中 nav 设置为 false。
(b) 如果您想要一个独立于路由的超链接,请将 href(或您所称的任何名称)设置为您想要的 url(我在示例中使用了“zoldello.wordpress.com”)。无需添加额外的路线

(3) 遵循构建 DOM 的基本 aurelia 规则(重复、模板等)

这是一个例子:

HTML 文件

<li repeat.for="route of router.navigation">
  <!-- if route has no submenu -->
  <a href.bind="route.href" if.bind="!route.settings.subMenu">${route.title}</a>

  <!-- if route has submenu -->
  <a href.bind="javascript:;" class="dropdown-toggle" data-toggle="dropdown" 
  role="button" aria-haspopup="true" aria-expanded="false" if.bind="route.settings.subMenu">
  ${route.title} <span class="caret"></span></a>

  <ul if.bind="route.settings.subMenu">
    <li repeat.for="menu of route.settings.subMenu">
      <a href.bind="menu.href">${menu.title}</a>
    </li>
  </ul>
</li>



Javascript 文件

configureRouter(config) {
  config.map([{
    route:'home',
    title:'Home',
    nav:true,
    module:'home'
  },{
    route:'top-menu',
    title:'Top Menu',
    nav:true,
    settings:{
      subMenu:[
        {href:'#/sub1', title:'Submenu 1'},
        {href:'zoldello.wordpress.com', title:'Submenu 2'},
        {href:'#/sub3', title:'Submenu 3'}
      ]
    }
  }, {
    route:'sub1',
    title:'Submenu 1',
    nav:false,
    moduleId:'module'
  }, {
    route:'sub2',
    title:'Submenu 2',
    nav:false,
    moduleId:'module'
  }, {
    route:'sub3',
    title:'Submenu 3',
    nav:false,
    moduleId:'module'
  }])
}

【讨论】:

  • 如果您未在第二条路线上指定模块(或替代的有效选项),Aurelia 将引发异常。 You must specify a moduleId, redirect, navigationStrategy, or viewPorts.
【解决方案2】:

菲尔回答的小修复

html:

<li class=" ${route.settings.subMenu ? '' : 'dropdown'} " repeat.for="route of router.navigation">
                <!-- if route has no submenu -->
                <a href.bind="route.href" if.bind="!route.settings.subMenu">${route.title}</a>

                <!-- if route has submenu -->
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" if.bind="route.settings.subMenu">
                    ${route.title} <span class="caret"></span>
                </a>

                <ul class="dropdown-menu" if.bind="route.settings.subMenu">
                    <li repeat.for="menu of route.settings.subMenu">
                        <a href.bind="menu.href">${menu.title}</a>
                    </li>
                </ul>
            </li>

js

configureRouter(config) { config.map([{
route:'home',
title:'Home',
nav:true,
moduleid:'home'  },{
route:'top-menu',
title:'Top Menu',
nav:true,
moduleid:'module'
settings:{
  subMenu:[
    {href:'#/sub1', title:'Submenu 1'},
    {href:'zoldello.wordpress.com', title:'Submenu 2'},
    {href:'#/sub3', title:'Submenu 3'}
  ]
} }, {
route:'sub1',
title:'Submenu 1',
nav:false,
moduleId:'module'  }, {
route:'sub2',
title:'Submenu 2',
nav:false,
moduleId:'module'  }, {
route:'sub3',
title:'Submenu 3',
nav:false,
moduleId:'module'  }])}

【讨论】:

  • 我的建议是修正我的答案;既然你说这是一个小问题。
【解决方案3】:

当我降落在这里时,我也在寻找同样的东西。上面的答案很有帮助,但并没有把我带到我需要去的地方。我了解到Bootstrap 3 dropdown sub menu missing 和那里提供的解决方法,但又需要更多的东西。 然后我找到了http://www.smartmenus.org/,它在我们的生产应用程序的 Aurelia 下拉菜单中提供了我需要的响应能力和功能。我与他们的团队合作,获得了一个运行良好的骨架应用程序版本。 你可以在http://www.smartmenus.org/files/demos/aurelia/SmartMenusDemo.zip下载。

app.ts 文件与上面的示例类似,但添加了对字体真棒图标的支持:

import {RouterConfiguration, Router} from 'aurelia-router';
import 'jquery';
import 'bootstrap';
import 'smartmenus';
import 'smartmenus-bootstrap';

export class App {
    router: Router;

    configureRouter(config: RouterConfiguration, router: Router) {
        config.title = 'Aurelia';
        config.map([
            { route: ['', 'welcome'], name: 'welcome', moduleId: './welcome', nav: true, title: 'Welcome' },
            {
                route: 'users', name: 'users', moduleId: './users', nav: true, title: 'Show Users',
                settings: {
                    subMenu: [{ href: '#/users', title: 'Users', iconClass: 'fa fa-slideshare' },
                        { href: '#/usersTest', title: 'Test Users', iconClass: 'fa fa-street-view' },
                                {
                                    href: '#', title: 'Sub Sub', iconClass: 'fa fa-medium', settings: {
                                        subMenu: [{ href: '#/child-router', title: 'Child Router', iconClass: 'fa fa-registered' },
                                            { href: '#/usersTest', title: 'Test Users', iconClass: 'fa fa-street-view' }]
                                    }
                                },
                                { href: '#/child-router', title: 'Child Router', iconClass: 'fa fa-registered' }]
                }
            },
            { route: 'usersTest', name: 'usersTest', moduleId: './usersTest', nav: false, title: 'Test Users' },
            { route: 'child-router', name: 'childRouter', moduleId: 'child-router', nav: false, title: 'Child Router' },
            { route: 'users', name: 'users', moduleId: './users', nav: true, title: 'Github Users' }
        ]);

        this.router = router;
    }

    attached(): void {
        $.SmartMenus.Bootstrap.init();
    }

}

我在 nav-bar.html 中实现了对 4 级子菜单的支持:

<template bindable="router">
    <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#top-level-nav">
                <span class="sr-only">Toggle Navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">
                <i class="fa fa-home"></i>
                <span>${router.title}</span>
            </a>
        </div>

        <div class="collapse navbar-collapse" id="top-level-nav">
            <ul id="main-menu" class="nav navbar-nav ">
                <li repeat.for="route of router.navigation" class="${row.isActive ? 'active' : ''} ${route.settings.subMenu ? 'dropdown' : ''}">
                    <!-- if route has no submenu -->
                    <a href.bind="route.href" if.bind="!route.settings.subMenu">${route.title}</a>

                    <!-- if route has submenu -->
                    <a if.bind="route.settings.subMenu" class="dropdown-toggle" data-toggle="dropdown"
                       role="button" aria-haspopup="true" aria-expanded="true">
                        ${route.title} <span class="caret"></span>
                    </a>
                    <ul if.bind="route.settings.subMenu" class="dropdown-menu">
                        <li repeat.for="l2SubMenu of route.settings.subMenu">
                            <a href.bind="l2SubMenu.href" if.bind="!l2SubMenu.settings.subMenu"><span class.bind="l2SubMenu.iconClass"> </span>&nbsp&nbsp${l2SubMenu.title}</a>
                            <a href.bind="l2SubMenu.href" if.bind="l2SubMenu.settings.subMenu" class="dropdown-toggle" data-toggle="dropdown"
                               role="button" aria-haspopup="true" aria-expanded="true">
                                <span class.bind="l2SubMenu.iconClass"> </span>&nbsp&nbsp${l2SubMenu.title} <span class="caret"></span>
                            </a>
                            <ul if.bind="l2SubMenu.settings.subMenu" class="dropdown-menu">
                                <li repeat.for="l3SubMenu of l2SubMenu.settings.subMenu">
                                    <a href.bind="l3SubMenu.href" if.bind="!l3SubMenu.settings.subMenu"><span class.bind="l3SubMenu.iconClass"> </span>&nbsp&nbsp${l3SubMenu.title}</a>
                                    <a href.bind="l3SubMenu.href" if.bind="l3SubMenu.settings.subMenu" class="dropdown-toggle" data-toggle="dropdown"
                                       role="button" aria-haspopup="true" aria-expanded="true">
                                        <span class.bind="l3SubMenu.iconClass"> </span>
                                        &nbsp&nbsp${l3SubMenu.title} <span class="caret"></span>
                                    </a>
                                    <ul if.bind="l3SubMenu.settings.subMenu" class="dropdown-menu">
                                        <li repeat.for="l4SubMenu of l3SubMenu.settings.subMenu">
                                            <a href.bind="l4SubMenu.href"><span class.bind="l4SubMenu.iconClass"> </span>&nbsp&nbsp${l4SubMenu.title}</a>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>

            <ul class="nav navbar-nav navbar-right">
                <li class="loader" if.bind="router.isNavigating">
                    <i class="fa fa-spinner fa-spin fa-2x"></i>
                </li>
            </ul>
        </div>
    </nav>
</template>

如您所见,SmartMenus 不需要对应用程序进行太多更改,但在 Aurelia 中为我们提供了响应迅速的多级下拉菜单,并且具有 Bootstrap 的强大功能,而不管 Bootstrap 是否支持该功能。

希望这对某人有所帮助!

【讨论】:

猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多