角度2-如何使用this.router.parent.navigate('/ about')导航到另一条路线?


186

角度2-如何使用导航到另一条路线this.router.parent.navigate('/about')

它似乎不起作用。我尝试了,location.go("/about");因为那没有用。

基本上,一旦用户登录,我想将他们重定向到另一个页面。

这是我的代码如下:

 import {Component} from 'angular2/angular2';
 import {CORE_DIRECTIVES, FORM_DIRECTIVES} from 'angular2/angular2';
 import {Router} from 'angular2/router';

 import {AuthService} from '../../authService';

 //Model
 class User {
   constructor(public email: string, public password: string) {}
 }

 @Component({
   templateUrl:'src/app/components/todo/todo.html',
   directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
 })

 export class Todo {   
     model = new User('Mark@gmail.com', 'Password'); 
     authService:AuthService;
     router: Router;

   constructor(_router: Router, _authService: AuthService){   
       this.authService = _authService;
       this.router = _router;
   }

   onLogin = () => {
       this.authService.logUserIn(this.model).then((success) => {      

          //This is where its broke - below:          
          this.router.parent.navigate('/about');

       });
   }
 }

另外,我还在app.ts文件中设置了路由配置,如下所示:@RouteConfig([{path:'/',redirectTo:'/ home'},{path:'/ home',component:Todo,as :'Home'},{path:'/ about',component:About,as:'About'}])
AngularM

您应该删除/路径中不需要的
mast3rd3mon

Answers:


317

绝对路径路由

有两种方法用于导航,.navigate().navigateByUrl()

您可以使用该方法.navigateByUrl()进行绝对路径路由:

import {Router} from '@angular/router';

constructor(private router: Router) {}

navigateToLogin() {
   this.router.navigateByUrl('/login');
}

您将绝对路径放置到要导航到的组件的URL。

注意:调用路由器的navigateByUrl方法时,请始终指定完整的绝对路径。绝对路径必须以前导开头/

// Absolute route - Goes up to root level    
this.router.navigate(['/root/child/child']);

// Absolute route - Goes up to root level with route params   
this.router.navigate(['/root/child', crisis.id]);

相对路径路由

如果要使用相对路径路由,请使用.navigate()方法。

注意:路由的工作方式(尤其是父路由,兄弟路由和子路由)是有点不直观的:

// Parent route - Goes up one level 
// (notice the how it seems like you're going up 2 levels)
this.router.navigate(['../../parent'], { relativeTo: this.route });

// Sibling route - Stays at the current level and moves laterally, 
// (looks like up to parent then down to sibling)
this.router.navigate(['../sibling'], { relativeTo: this.route });

// Child route - Moves down one level
this.router.navigate(['./child'], { relativeTo: this.route });

// Moves laterally, and also add route parameters
// if you are at the root and crisis.id = 15, will result in '/sibling/15'
this.router.navigate(['../sibling', crisis.id], { relativeTo: this.route });

// Moves laterally, and also add multiple route parameters
// will result in '/sibling;id=15;foo=foo'. 
// Note: this does not produce query string URL notation with ? and & ... instead it
// produces a matrix URL notation, an alternative way to pass parameters in a URL.
this.router.navigate(['../sibling', { id: crisis.id, foo: 'foo' }], { relativeTo: this.route });

或者,如果您只需要在当前路线路径内导航,但要导航至其他路线参数:

// If crisis.id has a value of '15'
// This will take you from `/hero` to `/hero/15`
this.router.navigate([crisis.id], { relativeTo: this.route });

链接参数数组

链接参数数组包含用于路由器导航的以下成分:

  • 到目标组件的路由路径。 ['/hero']
  • 路由URL中必需的和可选的路由参数。['/hero', hero.id]要么['/hero', { id: hero.id, foo: baa }]

类目录语法

路由器在链接参数列表中支持类似目录的语法,以帮助指导路由名称查找:

./ 或没有相对于当前水平的前斜线。

../ 在路由路径中上一层。

您可以将相对导航语法与祖先路径结合使用。如果必须导航到同级路由,则可以使用../<sibling>约定上一层,然后沿同级路由上下移动。

有关相对定位的重要说明

要使用该Router.navigate方法导航相对路径,必须提供,ActivatedRoute以使路由器了解您在当前路由树中的位置。

在链接参数数组之后,将relativeTo属性设置为的对象添加到ActivatedRoute。然后,路由器根据活动路由的位置计算目标URL。

摘自官方Angular Router文档


3
请注意,如果您有子路线: { path: 'home', component: Home, children: homeRoutes }那么您想将其提供给路由器方法:this.router.navigate(['home/address-search'])this.router.navigateByUrl(/'home/address-search')
Daniel Ram

即使这是一个很好的答案,也要注意 this.router= Router;可能会使一些读者感到困惑,在这种情况下,要提到对Router的依赖项注入,我应该改为使用此代码进行制作 constructor( private router: Router )
siddharta

@siddharta感谢您的提示,直到您指出来,我才注意到。我一定是本来很快就写的,打算以后再更新却忘了。该示例已更新,现在可以使用适当的依赖项注入。
TetraDev

@TetraDev和在哪里“this.route”来自:d,将其添加到乌尔依赖
菜鸟

33

你应该用

this.router.parent.navigate(['/About']);

除了指定路线路径,您还可以指定路线名称:

{ path:'/About', name: 'About',   ... }

this.router.parent.navigate(['About']);

1
嗨,当我这样做时,我在打字稿编译器中收到以下错误消息:“'string'类型的参数无法分配给any []类型的参数,String类型中缺少属性推送”
AngularM

我尝试了一下,但没有成功:this.router.parent.navigate('[/ About]');
AngularM 2015年

4
您应该使用以下语法:this.router.parent.navigate(['/ About']); 您必须传递数组['/ About']而不是字符串'[/ About]'
Luca 2015年

对于路由器3测试版使用this._router.navigate(['/some-route']);
阿德里安Moisa

27

也可以不用 parent

像这样说路由器定义:

{path:'/about',    name: 'About',   component: AboutComponent}

然后可以导航name而不是path

goToAboutPage() {
    this.router.navigate(['About']); // here "About" is name not path
}

已针对V2.3.0更新

在从v2.0路由中,name属性不再存在。没有名称属性的路由定义。因此,您应该使用path而不是namethis.router.navigate(['/path'])而且路径没有前导斜线,因此请使用path: 'about'代替path: '/about'

路由器定义如下:

{path:'about', component: AboutComponent}

然后可以通过 path

goToAboutPage() {
    this.router.navigate(['/about']); // here "About" is path
}

6
name在Angular 2.0中的Route类型上已弃用。
RynoRn

在Angular 2中v2.3.0data应使用代替name。有关更多详细信息-> angular.io/docs/ts/latest/guide/router.html
WildDev

8
import { Router } from '@angular/router';
//in your constructor
constructor(public router: Router){}

//navigation 
link.this.router.navigateByUrl('/home');

3
尽管此代码段可能是解决方案,但包括说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
亚当·基普尼斯

2

我个人发现,由于我们维护着一个ngRoutes收藏(长篇小说),所以我从以下地方找到了最大的乐趣:

GOTO(ri) {
    this.router.navigate(this.ngRoutes[ri]);
}

实际上,我将其用作面试问题之一。通过这种方式,我可以通过观察谁在GOTO(1)为主页重定向而迷惑时立即了解谁在不断发展。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.