Angular 2 - Как перейти к другому маршруту, используя this.router.parent.navigate ('/ about')?

186

Angular 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');

       });
   }
 }
AngularM
источник
Кроме того, я установил конфигурацию маршрута в своем файле app.ts следующим образом: @RouteConfig ([{путь: '/', redirectTo: '/ home'}, {путь: '/ home', компонент: Todo, as : 'Home'}, {path: '/ about', компонент: About, as: 'About'}])
AngularM
Вы должны удалить /в своих путях, как это не требуется
mast3rd3mon

Ответы:

319

Абсолютная маршрутизация

Есть 2 метода для навигации, .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

TetraDev
источник
3
Имейте в виду, если у вас есть дочерние маршруты: { path: 'home', component: Home, children: homeRoutes }тогда вы хотите предоставить это методу роутера: this.router.navigate(['home/address-search'])ИЛИthis.router.navigateByUrl(/'home/address-search')
Даниэль Рам
Даже если это хороший ответ, важно заметить, что это this.router= Router;может сбить с толку некоторых читателей, в данном случае это упоминание о внедрении зависимостей в Router, которое я должен сделать с помощью этого кода constructor( private router: Router )
siddharta
@siddharta Спасибо за совет, я не заметил, пока ты не указал на это. Я, должно быть, первоначально написал это быстро и намеревался обновить это позже, но забыл. Пример был обновлен для использования правильного внедрения зависимостей.
TetraDev
@TetraDev и откуда взялся "this.route": D, добавь его к своим зависимостям
Noob
33

Вы должны использовать

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

Помимо указания маршрута, вы также можете указать название вашего маршрута:

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

this.router.parent.navigate(['About']);
Лука
источник
1
Привет, когда я делаю это, я получаю это сообщение об ошибке в моем компиляторе машинописного текста: «Аргумент типа 'строка' не может быть назначен параметру типа any [], Push свойства отсутствует в типе String"
AngularM
Я попробовал это, и это не сработало: this.router.parent.navigate ('[/ About]');
AngularM
4
Вы должны использовать этот синтаксис: this.router.parent.navigate (['/ About']); Вы должны передать массив ['/ About'], а не строку '[/ About]'
Luca
Для бета-версии 3 маршрутизатораthis._router.navigate(['/some-route']);
Адриан Моиза
27

Также можно использовать без parent

скажем определение роутера вроде:

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

затем можно перемещаться nameвместоpath

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

Обновлено для V2.3.0

В Routing из v2.0 имя свойства больше не существует. маршрут определяют без имени свойства. поэтому вы должны использовать путь вместо имени . this.router.navigate(['/path'])и нет косой черты для пути, так что используйте path: 'about'вместоpath: '/about'

определение маршрутизатора как:

{path:'about', component: AboutComponent}

затем можно перемещаться по path

goToAboutPage() {
    this.router.navigate(['/about']); // here "About" is path
}
Шайшаб Рой
источник
6
nameне рекомендуется для типа Route в Angular 2.0.
RynoRn
в угловых 2 должно быть использовано вместо . Для получения более подробной информации -> angular.io/docs/ts/latest/guide/router.htmlv2.3.0dataname
WildDev 12.12.16
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)перенаправлением на домашнюю страницу.

ZenAtWork
источник