Aurelia:如何在子路径之间导航
我试图从一个孩子的路线导航到另一个孩子的路线,但我不断地得到Aurelia:如何在子路径之间导航,aurelia,Aurelia,我试图从一个孩子的路线导航到另一个孩子的路线,但我不断地得到找不到的路线。我的主要问题是:如何在子视图之间导航 下面是代码,下面还有其他问题 应用程序模式视图 应用程序类: export class App { configureRouter(config, router) { config.title = 'My Site'; config.map([ { route: ['','job-view'], name: 'jobView', moduleId: '
找不到的路线
。我的主要问题是:如何在子视图之间导航
下面是代码,下面还有其他问题
应用程序模式视图
应用程序类:
export class App {
configureRouter(config, router) {
config.title = 'My Site';
config.map([
{ route: ['','job-view'], name: 'jobView', moduleId: './job-view', nav: true, title:'Jobs'},
{ route: ['services'], name: 'services', moduleId: './services', nav: true, title:'Services'}
]);
this.router = router;
this.router.refreshNavigation();
}
}
<template>
<require from='./nav-bar'></require>
<nav-bar router.bind="router"></nav-bar>
<div class="container">
<router-view></router-view>
</div>
</template>
export class JobView {
configureRouter(config, router) {
config.map([
{ route: ['','jobs'], name: 'jobs', moduleId: './jobs', nav: false, title:'Jobs', settings:{icon:'glyphicon glyphicon-align-justify'} },
{ route: ['job/:id'], name: 'job', moduleId: './job', nav: false, title:'Job Details'}
]);
this.router = router; //WHY SAVE THIS?
this.router.refreshNavigation();
}
}
<template>
<router-view></router-view>
</template>
<!-- a bunch of html //-->
<!-- HOW TO USE ROUTER IN HTML, NOT BELOW URL HREF? //-->
<a href="#/jobs">Print Jobs</a>
<!-- a bunch of html //-->
Q.2:如果总是可以从aurelia router
访问路由器,为什么我们需要在这里保存路由器
应用程序页面:
export class App {
configureRouter(config, router) {
config.title = 'My Site';
config.map([
{ route: ['','job-view'], name: 'jobView', moduleId: './job-view', nav: true, title:'Jobs'},
{ route: ['services'], name: 'services', moduleId: './services', nav: true, title:'Services'}
]);
this.router = router;
this.router.refreshNavigation();
}
}
<template>
<require from='./nav-bar'></require>
<nav-bar router.bind="router"></nav-bar>
<div class="container">
<router-view></router-view>
</div>
</template>
export class JobView {
configureRouter(config, router) {
config.map([
{ route: ['','jobs'], name: 'jobs', moduleId: './jobs', nav: false, title:'Jobs', settings:{icon:'glyphicon glyphicon-align-justify'} },
{ route: ['job/:id'], name: 'job', moduleId: './job', nav: false, title:'Job Details'}
]);
this.router = router; //WHY SAVE THIS?
this.router.refreshNavigation();
}
}
<template>
<router-view></router-view>
</template>
<!-- a bunch of html //-->
<!-- HOW TO USE ROUTER IN HTML, NOT BELOW URL HREF? //-->
<a href="#/jobs">Print Jobs</a>
<!-- a bunch of html //-->
作业查看页面:
export class App {
configureRouter(config, router) {
config.title = 'My Site';
config.map([
{ route: ['','job-view'], name: 'jobView', moduleId: './job-view', nav: true, title:'Jobs'},
{ route: ['services'], name: 'services', moduleId: './services', nav: true, title:'Services'}
]);
this.router = router;
this.router.refreshNavigation();
}
}
<template>
<require from='./nav-bar'></require>
<nav-bar router.bind="router"></nav-bar>
<div class="container">
<router-view></router-view>
</div>
</template>
export class JobView {
configureRouter(config, router) {
config.map([
{ route: ['','jobs'], name: 'jobs', moduleId: './jobs', nav: false, title:'Jobs', settings:{icon:'glyphicon glyphicon-align-justify'} },
{ route: ['job/:id'], name: 'job', moduleId: './job', nav: false, title:'Job Details'}
]);
this.router = router; //WHY SAVE THIS?
this.router.refreshNavigation();
}
}
<template>
<router-view></router-view>
</template>
<!-- a bunch of html //-->
<!-- HOW TO USE ROUTER IN HTML, NOT BELOW URL HREF? //-->
<a href="#/jobs">Print Jobs</a>
<!-- a bunch of html //-->
Q.3:我已经看到了router.navigateToRoute
和router.navigate
引用,但没有说明何时使用或两者之间的区别,文档也没有解释。应该使用哪一种
作业页面:
jobs.html
的详细信息是不相关的,所以这里不列出它们
最后,作业
视图:
工作类别:
与job.js
无关,因此不列出代码。最多我可以执行导航返回到作业
,但这将在下面的页面中处理
作业页面:
export class App {
configureRouter(config, router) {
config.title = 'My Site';
config.map([
{ route: ['','job-view'], name: 'jobView', moduleId: './job-view', nav: true, title:'Jobs'},
{ route: ['services'], name: 'services', moduleId: './services', nav: true, title:'Services'}
]);
this.router = router;
this.router.refreshNavigation();
}
}
<template>
<require from='./nav-bar'></require>
<nav-bar router.bind="router"></nav-bar>
<div class="container">
<router-view></router-view>
</div>
</template>
export class JobView {
configureRouter(config, router) {
config.map([
{ route: ['','jobs'], name: 'jobs', moduleId: './jobs', nav: false, title:'Jobs', settings:{icon:'glyphicon glyphicon-align-justify'} },
{ route: ['job/:id'], name: 'job', moduleId: './job', nav: false, title:'Job Details'}
]);
this.router = router; //WHY SAVE THIS?
this.router.refreshNavigation();
}
}
<template>
<router-view></router-view>
</template>
<!-- a bunch of html //-->
<!-- HOW TO USE ROUTER IN HTML, NOT BELOW URL HREF? //-->
<a href="#/jobs">Print Jobs</a>
<!-- a bunch of html //-->
Q.4:同样,我希望路由到relative,即使是在HTML页面中。以上方法不起作用,我应该用什么
在一个类似的问题中出现了一个错误,但是将作业视图
注入作业
并使用作业视图
保存的路由器也不起作用
顺便说一下,如果我手动导航到http://localhost:3000/#/job-view/job/3
页面加载良好,因此路由器有问题
国防部注意:
在上有人问过类似的问题,但没有找到有效的解决方案。我在Aurelia应用程序中配置子路由器的方式如下:
app.js
export class App {
configureRouter(config, router) {
config.map([
{ route: ['','home'], name: 'home', moduleId: 'home', nav: true },
{ route: 'work', name: 'work', moduleId: 'work/work-section', nav: true },
]);
this.router = router;
}
}
work/work-section.js
export class WorkSection {
configureRouter(config, router) {
config.map([
{ route: '', moduleId: './work-list', nav: false },
{ route: ':slug', name: 'workDetail', moduleId: './work-detail', nav: false }
]);
this.router = router;
};
}
相应的“work section.html”只是一个路由器视图:
<template>
<router-view></router-view>
</template>
希望这能帮到你。我不能100%确定您是否询问如何重定向,或者如何从视图导航到子路径,因此如果我错了,请纠正我,我将尽力为您更新我的答案。我将尝试在下面逐一回答您的问题
我将从第二季度开始
问题2:如果路由器总是可以从计算机访问,为什么我们需要在这里保存它
奥雷莉亚路由器
因此,在您的应用模式视图App类中,您正在视图中引用路由器属性:
,这就是为什么您需要声明该属性才能使用它。在第二个视图中,您不是,所以您不需要它:-)
当您需要在main.ts/main.js(应用程序的起点)中处理路由器时,也会添加属性router
。这是因为路由器是第一次在那里配置的,并且注入将不会在构造函数中工作,所以您需要保存此属性以在configureRouter(..)
方法中获取它(注意:这是beta 1之前的情况,我不知道现在是否仍然存在)
在代码中,您有一个对this.router.refreshNavigation()的调用代码>这将确保您的路由器更新了有关路由当前位置的新信息
问题3:我已经看到router.navigateToRoute和router.navigate都被引用了,但是没有说明何时使用它们或者它们之间的区别,文档也没有解释。应该使用哪一种?文件
方法router.navigate(fragment:string,options?:any)
使用URL片段而不是路由名称来导航,例如router.navigate(“#/app/child”,{……})
。此方法必须用于在路由器之间绝对导航,以及访问父URL等
如果您仅在当前路由器周围导航,您将始终使用router.navigateToRoute(路由:string,params?:any,options?:any)
。此方法使用的是路由名称,而不是URL,我们只是在自定义路由映射中添加了一个路由名称(自定义表示当前子路由映射,或当前主路由,与我们在页面上的URL位置有关)。在这里,您可以更方便地传递URL参数,如您所见。您可以使用params对象,而不是将URL与params连接起来
问题4:同样,我希望路由到relative,即使在HTML页面中也是如此。以上方法不起作用,我应该用什么
在Aurelia中,我们没有直接使用标签的href
属性进行导航。正如Brandon已经回答的那样,您必须使用route href
属性,这可能没有任何文档记录,只是出现在论坛和门户上。这相当于路由器.navigateToRoute(路由:string,params?:any,options?:any)
,因此您不能使用它在路由器之间导航。在这种情况下,您可以使用自定义属性或只使用单击.triger=“navTo('./app/child')”
,其中navTo()
方法在视图模型中实现,如下所示:
public navTo(routeName: string) {
// Assuming you are injecting router somewhere in the constructor
this.router.navigateToRoute(routeName);
}
最后是你的主题问题:
问题1:如何在子路由之间导航
现在您可能知道答案了,只需使用:router.navigate(fragment:string,options?:any)
和绝对URL即可
下面是解决此问题的自定义属性示例:
import {inject} from "aurelia-dependency-injection";
import {Router} from "aurelia-router";
import {customAttribute} from "aurelia-framework";
@customAttribute('nav-href')
@inject(Element, Router)
export class NavHref {
private value: string = '';
constructor(private element: Element, private router: Router) {
let $this = this;
element.addEventListener('click', () => {
if ($this.value === 'back') {
$this.router.navigateBack();
} else {
// expression
$this.router.navigate($this.value);
}
});
}
public valueChanged(newValue: string, oldValue: string) {
this.value = newValue;
}
}
首先,您需要将其导入HTML,我将我的文件命名为nav.href.ts:
<require from="common/nav.href"></require>
然后在HTML代码中使用它:
<a nav-href="#/home/any-location">My link to any location</a>
希望这能对你有所帮助,干杯:-)我以前从未见过这样的事。有趣。有相关文件吗?有机会的话我会试试的。我遇到的问题是调用this.router.navigateToRoute(“作业”{id:id})代码>。我将更新问题以反映这一点。对于回复您的时间延误深表歉意。route href位于“生成路由URL”下的备忘单中,它确实this.router.navigateToRoute('workDetail',{slug:'slug'})
(或者应该是this.router.navigate('workDetail',{slug:'s