Angular 2: ¿Cómo navegar a otra ruta usando this.router.parent.navigate ('/ about')?

186

Angular 2 - Cómo navegar a otra ruta usando this.router.parent.navigate('/about').

No parece funcionar. Lo intenté location.go("/about");porque eso no funcionó.

Básicamente, una vez que un usuario ha iniciado sesión, quiero redirigirlo a otra página.

Aquí está mi código a continuación:

 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('[email protected]', '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');

       });
   }
 }
AngularM
fuente
Además, configuré la configuración de ruta en mi archivo app.ts de la siguiente manera: @RouteConfig ([{path: '/', redirectTo: '/ home'}, {path: '/ home', componente: Todo, como : 'Inicio'}, {ruta: '/ acerca de', componente: Acerca de, como: 'Acerca de'}])
AngularM
debe quitar la /de sus caminos, ya que requiere isnt
mast3rd3mon

Respuestas:

319

Ruta de ruta absoluta

Hay 2 métodos para la navegación, .navigate()y.navigateByUrl()

Puede usar el método .navigateByUrl()para el enrutamiento absoluto de la ruta:

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

constructor(private router: Router) {}

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

Pones la ruta absoluta a la URL del componente al que deseas navegar.

Nota: Siempre especifique la ruta absoluta completa cuando llame al navigateByUrlmétodo del enrutador . Los caminos absolutos deben comenzar con un líder/

// 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]);

Enrutamiento de ruta relativa

Si desea utilizar el enrutamiento de ruta relativa, utilice el .navigate()método

NOTA: No es intuitivo cómo funciona el enrutamiento, especialmente las rutas principales, secundarias y secundarias:

// 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 });

O si solo necesita navegar dentro de la ruta de ruta actual, pero a un parámetro de ruta diferente:

// 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 });

Conjunto de parámetros de enlace

Una matriz de parámetros de enlace contiene los siguientes ingredientes para la navegación del enrutador:

  • La ruta de la ruta al componente de destino. ['/hero']
  • Parámetros de ruta obligatorios y opcionales que entran en la URL de ruta. ['/hero', hero.id]o['/hero', { id: hero.id, foo: baa }]

Sintaxis tipo directorio

El enrutador admite una sintaxis similar a un directorio en una lista de parámetros de enlace para ayudar a guiar la búsqueda del nombre de ruta:

./ o ninguna barra inclinada es relativa al nivel actual.

../ para subir un nivel en la ruta de la ruta.

Puede combinar la sintaxis de navegación relativa con una ruta de antepasado. Si debe navegar a una ruta entre hermanos, puede usar la ../<sibling>convención para subir un nivel y luego subir y bajar la ruta de la ruta entre hermanos.

Notas importantes sobre la relativa nagivación

Para navegar por una ruta relativa con el Router.navigatemétodo, debe proporcionar el ActivatedRoutepara dar al enrutador conocimiento de dónde se encuentra en el árbol de ruta actual.

Después de la matriz de parámetros de enlace, agregue un objeto con una relativeTopropiedad establecida en ActivatedRoute. Luego, el enrutador calcula la URL de destino en función de la ubicación de la ruta activa.

De la documentación oficial del enrutador angular

TetraDev
fuente
3
Tenga en cuenta que si tiene rutas secundarias: { path: 'home', component: Home, children: homeRoutes }entonces desea proporcionar eso al método de enrutador: this.router.navigate(['home/address-search'])Othis.router.navigateByUrl(/'home/address-search')
Daniel Ram
Incluso esta es una buena respuesta, es importante tener en cuenta que this.router= Router;puede confundir a algunos lectores, en este caso es una mención a una inyección de dependencia de Router, que debería hacer usando este código en su lugar constructor( private router: Router )
siddharta
@siddharta Gracias por la sugerencia, no me di cuenta hasta que lo señaló. Originalmente debí escribirlo rápidamente y tenía la intención de actualizarlo más tarde, pero lo olvidé. El ejemplo se ha actualizado para usar la inyección de dependencia adecuada ahora.
TetraDev
@TetraDev y de dónde vino "this.route": D, agréguelo a sus dependencias
Noob
33

Deberías usar

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

Además de especificar la ruta de la ruta, también puede especificar el nombre de su ruta:

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

this.router.parent.navigate(['About']);
Luca
fuente
1
Hola, cuando hago eso recibo este mensaje de error en mi compilador de mecanografiado: "El argumento del tipo 'string' no es asignable al parámetro del tipo any [], falta la inserción de propiedad en el tipo String"
AngularM
Intenté esto y no funcionó: this.router.parent.navigate ('[/ About]');
AngularM
44
Debe usar esta sintaxis: this.router.parent.navigate (['/ About']); Debe pasar la matriz ['/ Acerca de'] no la cadena '[/ Acerca de]'
Luca
Para el uso de la versión beta del enrutador 3this._router.navigate(['/some-route']);
Adrian Moisa el
27

También se puede usar sin parent

decir definición de enrutador como:

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

entonces puede navegar en namelugar depath

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

Actualizado para V2.3.0

En Enrutamiento desde v2.0, la propiedad de nombre ya no existe. ruta definida sin nombre de propiedad. así que deberías usar la ruta en lugar del nombre . this.router.navigate(['/path'])y sin barra diagonal para la ruta, así que úsala en path: 'about'lugar depath: '/about'

definición de enrutador como:

{path:'about', component: AboutComponent}

entonces puede navegar por path

goToAboutPage() {
    this.router.navigate(['/about']); // here "About" is path
}
Shaishab Roy
fuente
66
nameestá en desuso en el tipo de ruta en Angular 2.0.
RynoRn
en Angular 2 v2.3.0del datadeberá ser utilizado en lugar de name. Para más detalles -> 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');
suresh
fuente
3
Si bien este fragmento de código puede ser la solución, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
Adam Kipnis
2

Personalmente, descubrí que, dado que mantenemos una ngRoutescolección (larga historia), disfruto más de:

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

De hecho, lo uso como parte de una de nuestras preguntas de la entrevista. De esta manera, puedo obtener una lectura casi instantánea de quién se ha estado desarrollando para siempre al ver quién se contrae cuando se encuentran GOTO(1)con la redirección de la página de inicio.

ZenAtWork
fuente