Перенаправление на новую страницу в Angular 2 Routing

У меня есть сценарий: Домашняя страница (app.component.ts с main.html), которая маршрутизируется по умолчанию.

app.component.ts

@RouteConfig([
    {path: '/',name : 'Home' , component : HomeComponent , useAsDefault: true },
    {path: '/user', name : 'User' , component : UserComponent },
    {path: '/about', name : 'About' , component : AboutComponent},
    {path : 'contact', name : 'Contact' , component : ContactComponent}
])

main.html

<a [routerLink]="['/Home']">Home</a>
<a [routerLink]="['/User']">User Login</a>
<a [routerLink]="['/About']">About</a>
<a [routerLink]="['/Contact']">Contact</a>

<router-outlet></router-outlet>

Теперь скажем, для двух компонентов, которые я хочу маршрутизировать, используя выход маршрутизатора, но для пользователя я хочу направить на совершенно новую страницу, то есть не на выход маршрутизатора. Я пробовал navigate и navigateByUrl не работает, он все еще загружает его в <router-outlet> . Пожалуйста, не предлагайте window.href

Я пытался использовать класс Redirect в angular2/router , но не смог сделать все необходимое.


person Pratik Kelwalkar    schedule 21.03.2016    source источник
comment
Что такое целая новая страница? Другое приложение Angular2 (внешняя ссылка)?   -  person Günter Zöchbauer    schedule 21.03.2016
comment
Нет, для этого я бы просто использовал window.location.href='www.goggle.com' или <a href='www.google.com'></a>, но да, функциональность, аналогичная внутреннему компоненту (внутри приложения Angular 2), - это то, что мне нужно.   -  person Pratik Kelwalkar    schedule 21.03.2016
comment
Если вы знаете, как бороться, я надеюсь, вы можете сказать мне, спасибо   -  person Duke    schedule 24.10.2016
comment
@PratikKelwalkar Вы нашли решение? Я сталкиваюсь с той же ситуацией.   -  person Mehul Parmar    schedule 16.08.2020


Ответы (3)


ОБНОВЛЕНИЕ: весь код конфигурации маршрутизатора в этом ответе относится к маршрутизатору, который устарел и был удален примерно 6/2016

Я думаю, вам нужны дочерние маршруты - см. Plunker

Обновлен Plunker с перемещением навигации на Page1

где родительский маршрут позволяет переключаться между Page1 и Page2, Page1 позволяет переключаться между About и Contact, а Page2 имеет только User.

Page2 также может быть UserComponent напрямую, только если эта страница должна поддерживать более одного компонента, необходимо сделать ее компонентом с дочерними маршрутами.

Конечно, вы можете перемещаться между User и, например, About с помощью

router.navigate(['/Page1', 'About']);
router.navigate(['/Page2', 'User']);
import {Component, Directive, Output, EventEmitter} from 'angular2/core'
import {ROUTER_DIRECTIVES, RouteConfig} from 'angular2/router';

@Component({
  selector: 'contact',
  directives: [],
  template: `
  <h2>contact</h2>
`
})
export class ContactComponent {
}
@Component({
  selector: 'about',
  directives: [],
  template: `
  <h2>about</h2>
`
})
export class AboutComponent {
}
@Component({
  selector: 'user',
  directives: [],
  template: `
  <h2>user</h2>
`
})
export class UserComponent {
}
@Component({
  selector: 'page1',
  directives: [ROUTER_DIRECTIVES],
  template: `
  <h2>page1</h2>
  <router-outlet></router-outlet>
`
})
@RouteConfig([
    {path: '/about', name : 'About' , component : AboutComponent, useAsDefault: true},
    {path : '/contact', name : 'Contact' , component : ContactComponent}
])
export class Page1 {
}

@Component({
  selector: 'page2',
  directives: [ROUTER_DIRECTIVES],
  template: `
  <h2>page2</h2>
  <router-outlet></router-outlet>
`
})
@RouteConfig([
    {path: '/user', name : 'User' , component : UserComponent, useAsDefault: true},
])
export class Page2 {
}
@Component({
  selector: 'my-app',
  directives: [ROUTER_DIRECTIVES],
  template: `
  <h2>Hello {{name}}</h2>
  <a href="#" [routerLink]="['/Page1','About']">About</a>
  <a href="#" [routerLink]="['/Page1','Contact']">Contact</a>
  <a href="#" [routerLink]="['/Page2','User']">User</a>
  <router-outlet></router-outlet>
`
})
@RouteConfig([
    {path: '/page1/...',name : 'Page1' , component : Page1 , useAsDefault: true },
    {path: '/page2/...', name : 'Page2' , component : Page2 },
])
export class App {
  constructor() {
    this.name = 'Angular2';
  }  
}
person Günter Zöchbauer    schedule 21.03.2016
comment
очень здорово, что вы предоставили мгновенный плункер и решение, но, как я вижу в приведенном выше примере плунжера, когда я нажимаю «Пользователи», мне не нужно содержимое страницы, где находится <router-outlet>. То есть я не хочу, чтобы мой компонент загружался в этот выход, а хочу, чтобы он загружал его как новую целую страницу. еще раз спасибо за ответ - person Pratik Kelwalkar; 21.03.2016
comment
@PratikKelwalkar Вы нашли решение своей проблемы? Я сталкиваюсь с тем же здесь. Спасибо - person Habchi; 18.04.2017
comment
Что такое новая целая страница здесь? Обычно в Angular вы добавляете <router-outlet> в корневой компонент AppComponent и загружаете маршрут, который добавляет нужный компонент в этот <router-outlet>. - person Günter Zöchbauer; 18.04.2017
comment
@GünterZöchbauer Предположим, например, что у нас есть веб-сайт, целевая страница которого в основном предназначена для демонстрации функций вашего веб-приложения с помощью панели навигации с двумя кнопками входа и регистрации. Если вы нажмете на вход, я хочу отобразить новую другую страницу (без панели навигации, которая была у меня на целевой странице), содержащую только форму посередине. ‹router-outlet› используется как: ‹Link1› ‹Link2› ‹Link3› ‹Router-outlet› ==› где изменения вносятся в элементы панели навигации, но что, если при нажатии на ссылку я хочу новая структура без роутера-розетки? - person Habchi; 18.04.2017
comment
Я думаю, это стоит нового вопроса. Я бы просто использовал *ngIf на панели навигации, чтобы показать/скрыть его в зависимости от маршрута. - person Günter Zöchbauer; 18.04.2017
comment
Я уже пытался задать новый вопрос об этом, который устарел, и у него были довольно плохие комментарии, как будто это глупо, так что ... - person Habchi; 18.04.2017
comment
Отличный ответ @GünterZöchbauer. Спасибо. - person Elias MP; 21.04.2017
comment
@GileadKenzo Спасибо, но довольно устаревший. Конфигурация маршрута не будет работать с новым маршрутизатором. - person Günter Zöchbauer; 21.04.2017
comment
@GünterZöchbauer. Рассвет. В любом случае ваш ответ был действительно полным. Спасибо за ваши усилия и за помощь нам :) :) :). Ура, приятель - person Elias MP; 21.04.2017

У меня было аналогичное требование, когда мне приходилось переходить на новую страницу после нажатия кнопки. Допустим, у нас есть компоненты тренер, администратор, стажер, нижний колонтитул, заголовок и логин.

В нашем Appcomponent у меня есть

<header></header>
<login></login>
<router-outlet></router-outlet>
<footer></footer>

теперь, когда я перехожу на новую страницу после входа в систему, произойдет следующее: появится новая страница, но моя исходная страница входа все еще существует, и новая страница появится под этой страницей входа, потому что у нас есть

<router-outlet></router-outlet>

в шаблоне Appcomponent. Чтобы избавиться от этой проблемы, я добавил <header></header> и <footer></footer> в начале и в конце каждой страницы. Теперь в Appcomponent у нас есть только

<router-outlet></router-outlet>.

поэтому, когда мы переходим на новую страницу, она будет занимать всю страницу.

person Santosh Kadam    schedule 21.04.2017

Простое решение - просто использовать router-outlet в app.component.html вместо использования его в html, где написан ваш код пользовательского интерфейса. Это позволяет избежать появления новой страницы под исходной страницей. убедитесь, что вы не пишете код в app.component.html

например, если ваш основной HTML-код написан в home.component.html, и вам нужно перейти на страницу connection.component.html, вы можете сделать следующее:

index.html :

<app-root></app-root> // это направит вас к компоненту приложения из индекса

приложение.component.html :

<router-outlet></router-outlet> // это загрузит новый код страницы в app.component.html home.component.html:

<a routerLink =['/connection'] > Add connection </a> // маршруты к connection.html Вам не нужно писать router-outlet в home.component.html

person pujitha    schedule 09.04.2018