【问题标题】:Aurelia: child router routes display in "main" nav-bar and child view in app.html <router-view> element?Aurelia:子路由器路由显示在“主”导航栏和 app.html <router-view> 元素中的子视图中?
【发布时间】:2015-04-18 06:43:56
【问题描述】:

我们想要一个侧边栏菜单和一个“主要”区域。根据您的导航方式,侧边栏的菜单项会发生变化,并且会在“主”区域加载一个新视图。

我创建了带有&lt;router-view&gt; 元素的app.html 和一个可以显示主路由器导航的nav-bar.html。假设我最初将“管理”和“报告”作为路由(因此也是菜单项)。当用户单击“管理”时,我希望更新菜单以显示子路由(例如“用户”和“设置”),并在 app.html 的&lt;router-view&gt; 中显示管理视图模型。

最初我尝试创建一个子路由器,但后来我必须在 admin.html 中创建一个新的&lt;router-view&gt;(没有这个页面甚至无法加载)。相反,我希望 admin.html 视图显示在 app.html 的 &lt;router-view&gt; 内,并让子路由替换导航栏菜单中的“主”路由。

在 app.js 中,我有以下路由器配置:

this.router.configure((config) => {
    config.title = "Welcome";
    config.map([
        { route: "", moduleId: "welcom", nav: false, title: "Welcome" },
        { route: "reports", moduleId: "reports", nav: true, title: "Reports" },
        { route: "admin", moduleId: "users", nav: true, title: "Administration" },
    ]);
});

在 users.js 中,我有这个代码:

this.router.configure((config) => {
    config.title = "Users";
    config.map([
        { route: "", moduleId: "users", nav: true, title: "Users" },
        { route: "settings", moduleId: "settings", nav: true, title: "Settings" },
    ]);
});

最初,菜单应该是:
- 管理
- 报告

并且“welcome.html”应该是&lt;router-view&gt;中的视图(默认路由是'welcome')。

当用户单击(导航至)“管理”时,菜单应刷新为:
- 用户 - 设置

&lt;router-view&gt; 中添加“users.html”。

但是,为了让它完全正常工作,我需要在“users.html”中再添加一个&lt;router-view&gt;,这并不是我真正想要的(我希望将视图加载到 app.html 的 @987654330 @)。

有没有办法在 Aurelia 中实现这一点?我什至尝试将父路由器注入 Admin 构造函数(使用Parent.of(router) 绑定)然后router.addRoute()。路由被添加,但菜单没有更新(即使它是数据绑定的)。

【问题讨论】:

  • 我不知道其他人,但你失去了我
  • 嗨,马修 - 是的,这不是一个简单的“欢迎”示例!基本上我想知道我是否可以用来自子路由器的路由“替换”主路由器。入门套件中的“子路由器”有自己的视图和导航,我不希望这样 - 我想用子路由器的路由/视图“替换”主路由器。
  • 对不起,我正在尝试,但我没有遵循。
  • 嗨 Matthew - 看起来你想要一个两级菜单。一旦用户导航到Administration,您希望他们如何返回初始菜单集?
  • 哈哈不是我,我希望你现在认出我的名字;)

标签: routing aurelia


【解决方案1】:

我使用 Aurelia 创建了一个示例,该示例使用左侧菜单实现了分层菜单结构。

这里是notes about the sample project

你可以run the sample online测试一下

多级菜单示例展示了在构建 Aurelia SPA 网站时如何快速创建分层菜单。

多级菜单可帮助用户浏览页面层次结构。

很容易配置路由和层次结构,如下所示:

import aur = require("aurelia-router");
import mlmps = require("./MultiLevelMenuPipelineStep");

export class App {
    static inject = [aur.Router];

    constructor(public router: aur.Router) {
        this.router.configure((config) => {
            config.title = "Aurelia VS/TS";
            config.addPipelineStep("modelbind", mlmps.MultiLevelMenuPipelineStep);
            config.map([
                { route: ["", "home"], moduleId: "views/home", nav: true, title: "home", settings: { level: 0, show: true } },
                { route: ["item-1"], moduleId: "views/item-1", nav: true, title: "item 1", settings: { level: 0, show: true } },
                { route: ["item-1-1"], moduleId: "views/item-1-1", nav: true, title: "item 1.1", settings: { level: 1, show: false } },
                { route: ["item-1-2"], moduleId: "views/item-1-2", nav: true, title: "item 1.2", settings: { level: 1, show: false } },
                { route: ["item-2"], moduleId: "views/item-2", nav: true, title: "item 2", settings: { level: 0, show: true } },
                { route: ["item-2-1"], moduleId: "views/item-2-1", nav: true, title: "item 2.1", settings: { level: 1, show: false } },
                { route: ["item-2-2"], moduleId: "views/item-2-2", nav: true, title: "item 2.2", settings: { level: 1, show: false } },
                { route: ["item-2-2-1"], moduleId: "views/item-2-2-1", nav: true, title: "item 2.2.1", settings: { level: 2, show: false } },
                { route: ["item-2-2-2"], moduleId: "views/item-2-2-2", nav: true, title: "item 2.2.2", settings: { level: 2, show: false } },
                { route: ["item-2-3"], moduleId: "views/item-2-3", nav: true, title: "item 2.3", settings: { level: 1, show: false } }
            ]);
        });
    }
}

level 属性用于建立层次结构。 show 属性控制菜单中路由的可见性。路由器导航管道步骤查看目标导航并相应地设置路线可见性。导航助手提供了一个从当前路由向上导航的按钮,并向路由器调用相应的导航命令。

【讨论】:

  • 谢谢 Mike - 似乎是一个很好的解决方案!我设法让另一个解决方案起作用:我创建了一个带有“currentRouter”属性的“会话”单例。创建子路由器后,我将其分配给 session.currentRouter。然后我的导航栏绑定到 session.currentRouter.navigation。这种方法的唯一挑战是您需要预先了解所有路线 - 我的解决方案需要子页面动态确定菜单项。
  • @ColinDembovsky - 你提到你以不同的方式解决了这个问题 - 我很想看看你用来做这个的代码?您的解决方案不会有开源 github 源代码吗?我面临着类似的问题,需要更动态的解决方案。
  • 你会如何添加动态路由?
  • @ColinDembovsky 你是怎么做到的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多