繁体   English   中英

奥雷利亚(Aurelia)获取儿童路线

[英]Aurelia Get Child Routes

我有一个很大的导航,我想将应用程序中的所有链接呈现到其中,但是目前我只呈现应用程序路由,所以如何使用Aurelia中的任何方法从特定路由获取子路由?

例如:

<li repeat.for="route of router.navigation">
    <a href.bind="route.href">
        ${route.title}
    </a>
    <ul if.bind="route.childs">
        <li repeat.for="child of route.childs">
            <a href.bind="child.href">${child.title}</a>
        </li>
    </ul>
</li>

我认为您是要使用route.navigation代替route.childs

这是我使用的解决方案。 当我的路线分为各自的index.js文件时,以下代码将循环遍历顶级路线,加载每个模型并创建路线层次结构。

它在每个顶级router.navigation对象中创建一个新的navigation属性。 您将看到我的顶级路由参考dir/index模型-这些都包含进一步的路由配置。

app.js

import {inject} from "aurelia-framework";
import {Router, RouterConfiguration, RouteConfig, NavModel} from 'aurelia-router';
import {CompositionEngine, CompositionContext} from 'aurelia-templating';
import {relativeToFile} from 'aurelia-path';
import {Origin} from 'aurelia-metadata';

@inject(Router, CompositionEngine)
export class App {

    environment = '';

    constructor(Router, CompositionEngine) {
        this.router = Router;
        this.compositionEngine = CompositionEngine;
    }

    attached() {
        return this.mapNavigation(this.router);
    }

    configureRouter(config, router) {
        config.title = 'Aurelia';
        config.map([
            { route: '', name: 'welcome', moduleId: 'welcome', nav: true, title: 'Welcome' },
            { route: 'narrow-dashboard', name: 'narrow-dashboard', moduleId: 'narrow-dashboard/index', nav: true, title: 'Narrow Dashboard' },
            { route: 'wide-dashboard', name: 'wide-dashboard', moduleId: 'wide-dashboard/index', nav: true, title: "Wide Dashboard"},
            { route: 'examples', name: 'examples', moduleId: 'examples/index', nav: false, title: 'Examples'}
        ]);

        this.router = router;
    }

    mapNavigation(router: Router, config: RouteConfig) {
        let promises = [];
        let c = config ? config : {route: null};
        router.navigation.forEach( nav => {
            if (c.route !== nav.config.route) {
                promises.push(this.mapNavigationItem(nav, router));
          } else {
                promises.push(Promise.resolve(nav));
          }

        })
        return Promise.all(promises)
    }

    mapNavigationItem(nav, router) {
        const config = nav.config;
        const navModel = nav;

        if (config.moduleId) {
            const childContainer = router.container.createChild();
            const instruction = {
                viewModel: relativeToFile(config.moduleId, Origin.get(router.container.viewModel.constructor).moduleId),
    childContainer: childContainer,
                view: config.view || config.viewStrategy,
            };
            return this.compositionEngine.ensureViewModel(instruction)
  .then((context) => {
                if ('configureRouter' in context.viewModel) {
                    const childRouter = new Router(childContainer, router.history)
                    const childConfig = new RouterConfiguration()

                    context.viewModel.configureRouter(childConfig, childRouter)
                    childConfig.exportToRouter(childRouter)

                    childRouter.navigation.forEach( nav => {
                        nav.href = `${navModel.href}/${nav.config.href ? nav.config.href : nav.config.name}`
                    })
                    return this.mapNavigation(childRouter, config)
                        .then(r => navModel.navigation = r)
                        .then( () => navModel);
                }
                return navModel
            })
        }
        return Promise.resolve(navModel);
    }
}

nav-bar.html

        <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav navbar-nav__custom2 mr-auto">
                <li repeat.for="row of router.navigation" class="nav-item ${row.isActive ? 'active' : ''}">
                    <a class="nav-link" href.bind="row.href">${row.title} <span if.bind="row.isActive" class="sr-only">(current)</span></a>

                    <ul class="nav-item__submenu" if.bind="row.navigation.length > 0">
                        <li repeat.for="subrow of row.navigation" class="nav-item__subitem ${subrow.isActive ? 'active' : ''}">
                            <a class="nav-link" href.bind="subrow.href">${subrow.title} <span if.bind="subrow.isActive" class="sr-only">(current)</span></a>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
    </nav>
</template>

这是从许多博客文章中拼凑而成的,因此,我无法在其中引用很多原始信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM