https://angular.io/api/router/RouterLink很好地概述了如何创建将用户带到 Angular4 中的不同路线的链接,但是我找不到如何以编程方式做同样的事情,而需要用户点击链接
6 回答
通过网址导航
routerLink
像这样使用的指令:
<a [routerLink]="/inbox/33/messages/44">Open Message 44</a>
只是使用命令式导航router
及其navigateByUrl方法的包装器:
router.navigateByUrl('/inbox/33/messages/44')
从消息来源可以看出:
export class RouterLink {
...
@HostListener('click')
onClick(): boolean {
...
this.router.navigateByUrl(this.urlTree, extras);
return true;
}
因此,无论您需要将用户导航到另一条路线,只需注入router
and usenavigateByUrl
方法:
class MyComponent {
constructor(router: Router) {
this.router.navigateByUrl(...);
}
}
导航
您可以在路由器上使用另一种方法 -导航:
router.navigate(['/inbox/33/messages/44'])
两者的区别
使用
router.navigateByUrl
类似于直接更改地址栏——我们提供的是“完整”的新 URL。而router.navigate
通过将传入的命令数组(补丁)应用于当前 URL 来创建新 URL。为了清楚地看到差异,假设当前 URL 是
'/inbox/11/messages/22(popup:compose)'
.使用此 URL,调用
router.navigateByUrl('/inbox/33/messages/44')
将导致'/inbox/33/messages/44'
. 但是调用它router.navigate(['/inbox/33/messages/44'])
会导致'/inbox/33/messages/44(popup:compose)'
.
在官方文档中阅读更多内容。
router.navigate 与 router.navigateByUrl
router.navigate
只是一种方便的方法router.navigateByUrl
,它可以归结为:
navigate(commands: any[], extras) {
return router.navigateByUrl(router.createUrlTree(commands, extras), extras);
}
如其他答案中所述,router.navigateByUrl
仅接受绝对 URL:
// This will work
router.navigateByUrl("http://localhost/team/33/user/11")
// This WON'T work even though relativeTo parameter is in the signature
router.navigateByUrl("../22", {relativeTo: route})
所有相关计算均由router.createUrlTree
和完成router.navigate
。数组语法用于将每个数组元素视为 URL 修改“命令”。例如".."
- 向上,"path"
- 向下,{expand: true}
- 添加查询参数等。您可以像这样使用它:
// create /team/33/user/11
router.navigate(['/team', 33, 'user', 11]);
// assuming the current url is `/team/33/user/11` and the route points to `user/11`
// navigate to /team/33/user/11/details
router.navigate(['details'], {relativeTo: route});
// navigate to /team/33/user/22
router.navigate(['../22'], {relativeTo: route});
// navigate to /team/44/user/22
router.navigate(['../../team/44/user/22'], {relativeTo: route});
该{relativeTo: route}
参数很重要,因为这是路由器将用作相关操作的根。
通过组件的构造函数获取它:
// In my-awesome.component.ts:
constructor(private route: ActivatedRoute, private router: Router) {}
// Example call
onNavigateClick() {
// Navigates to a parent component
this.router.navigate([..], { relativeTo: this.route })
}
routerLink 指令
这个指令最好的一点是它会ActivatedRoute
为你检索。在引擎盖下它使用已经很熟悉:
router.navigateByUrl(router.createUrlTree(commands, { relativeTo: route }), { relativeTo: route });
以下变体将产生相同的结果:
[routerLink]="['../..']"
// if the string parameter is passed it will be wrapped into an array
routerLink="../.."
除了提供的答案之外,还有更多详细信息navigate
。从函数的评论中:
/**
* Navigate based on the provided array of commands and a starting point.
* If no starting route is provided, the navigation is absolute.
*
* Returns a promise that:
* - resolves to 'true' when navigation succeeds,
* - resolves to 'false' when navigation fails,
* - is rejected when an error happens.
*
* ### Usage
*
* ```
* router.navigate(['team', 33, 'user', 11], {relativeTo: route});
*
* // Navigate without updating the URL
* router.navigate(['team', 33, 'user', 11], {relativeTo: route, skipLocationChange: true});
* ```
*
* In opposite to `navigateByUrl`, `navigate` always takes a delta that is applied to the current
* URL.
*/
路由器指南有更多关于程序化导航的细节。
据我了解, router.navigate 用于相对于当前路径导航。例如:如果我们当前的路径是abc.com/user,我们想要导航到 url:abc.com/user/10对于这种情况,我们可以使用 router.navigate。
router.navigateByUrl() 用于绝对路径导航。
IE,
如果在这种情况下我们需要导航到完全不同的路线,我们可以使用 router.navigateByUrl
例如,如果我们需要从abc.com/user导航到abc.com/assets,在这种情况下我们可以使用 router.navigateByUrl()
句法 :
router.navigateByUrl(' ---- String ----');
router.navigate([], {relativeTo: route})
假设您在 http://localhost:4200 上运行服务器,并且在 http://localhost:4200/abc 上,并且在路由模块下,您定义了如下路径:
const appRoutes: Routes = [
{ path: 'abc', component: MainComponent, children: [
{path: '', component: InitialComponent},
{path: 'new', component: LoadedComponent}
]}]
现在,我们将从@angular/router 导入Router,并将其分配给构造函数(此处为myRoute)中的任何变量。
import { Router } from '@angular/router';
constructor(private myRoute: Router) { }
现在在您的方法中,您将使用navigateByUrl进行重定向,这意味着如果您在 http://localhost:4200/abc 上并尝试使用 navigateByUrl 重定向到 http://localhost:4200/abc/new 您将能够即它会首先尝试匹配 appRoutes 配置,一旦在孩子中找到它就会重定向到 LoadedComponent。代码如下:
this.myRoute.navigateByUrl('abc/new');
此外,如果我们使用导航,那么它将基于激活路由工作,并且它与当前活动路由有很小的变化:
import { ActivatedRoute, Router } from '@angular/router';
constructor(private myRoute: Router, private activeRoute: ActivatedRoute) { }
在这里,如果我在 http://localhost:4200/abc 并且我有一个方法调用将其导航到新路由,那么它将根据当前活动路由触发,如果它具有新的子路由,那么它将重定向到 http://localhost:4200/abc/new
this.myRoute.navigate(['new'], {relativeTo: this.activeRoute});
我遇到了同样的问题。我的解决方案:
...
<p @click=parseHTML v-html=data.html></p>
...
methods: {
parseHTML(event) {
if (event.target.href) {
event.preventDefault();
if (event.target.href.includes(location.hostname)) {
this.$router.push(event.target.href)
}
}
}
}