Подтвердить что ты не робот

Как использовать дочерние маршруты в Angular 2

Angular 2 версия: 2.0.0-alpha.44

Я пытаюсь выполнить маршрутизацию в Angular 2. Хотя мне удалось выполнить обычную маршрутизацию, я сталкиваюсь с некоторыми проблемами при представлении дочерних маршрутов. Вот пример на plnkr (http://plnkr.co/edit/Y5doqU1WcEe4Ldr7KfPJ)

Ниже приведен код для быстрой справки. Я пытаюсь достичь ниже маршрутизации

                                  App
                                  /\
                                 /  \
                             HomeCmp HelloCmp
                                      \
                                       \
                                     ChildCmp

И ниже показано, как я настроил свои пути

import {bootstrap, bind, Component, View} from 'angular2/angular2'
import {RouteConfig, RouteParams, ROUTER_DIRECTIVES, APP_BASE_HREF, ROUTER_BINDINGS} from 'angular2/router'

@Component({
  selector: 'child-cmp'
})
@View({
  template: `
    <div>
      <h3>Whats up</h3>
    </div>
  `
})
class ChildCmp { }

// ************************ Hello Component ***********************************
@Component({
  selector: 'hello-cmp'
})
@View({
  template: `
    <div>
      <h2>Hello there !</h2>
      <router-outlet></router-outlet>
    </div>
  `,
  directives: ROUTER_DIRECTIVES
})
@RouteConfig([
  {path: '/', component: ChildCmp, as: 'ChildCmp'}
])
class HelloCmp { }

//************************** HOME Component ***********************************
@Component({
  selector: 'home-cmp'
})
@View({
  template: `
    <div>
      <h2>Welcome Home</h2>
    </div>
  `
})
class HomeCmp {}

//************************* APP Component *************************************
@Component({
  selector: 'app-cmp'
})
@View({
  template: `
    <div>
      <h1>Hello {{message}}!</h1>
      <a [router-link]="['./HomeCmp']">home</a>
      <a [router-link]="['./HelloCmp']">hello</a>
      <hr>
      <router-outlet></router-outlet>
    </div>
  `,
  directives: ROUTER_DIRECTIVES
})
@RouteConfig([
  {path: '/', component: HomeCmp, as: 'HomeCmp'}
  {path: '/hello/...', component: HelloCmp, as: 'HelloCmp'}
])
export class App {
  message:string = 'world';
}

bootstrap(App, [
  ROUTER_BINDINGS,
  bind(APP_BASE_HREF).toValue(location.pathname)
]);

Когда я удаляю дочерние маршруты, он отлично работает. Но с детскими маршрутами я становлюсь ниже ошибки.

EXCEPTION: Link "["HelloCmp"]" does not resolve to a terminal or async instruction. in [null]

Я следил за статьей, упомянутой здесь . Но не может заставить его работать. Кто-нибудь может помочь? Спасибо

4b9b3361

Ответ 1

Вам просто нужно импортировать дочерний компонент в routerLink, тогда ваш код будет работать нормально. Например:

<a [routerLink]="['./HelloCmp','ChildCmp']">hello</a>

Вот рабочий plnkur вашего кода. Код плунжера

Для получения дополнительной информации об этой маршрутизации см. эту проблему в github здесь

Обновить до Angular 2 бета

По состоянию на Angular 2 бета здесь есть некоторые изменения:

  • router-link был изменен на routerLink

  • Вы также можете использовать useAsDefault : true вместо предоставления дочернего элемента во время routerLink, например:

    {путь: '/blabla', компоненты: ABC, имя: ABC, useAsDefault: true}

Ответ 2

Маршрутизация с помощью Angular4 -

Позвольте мне сначала определить конфигурацию маршрута, каждый маршрут может иметь свойство, называемое дочерними элементами, где вы можете определить дочерние маршруты этого маршрут.

const routes: Routes = [
  {path: '', redirectTo: 'home', pathMatch: 'full'},
  {path: 'find', redirectTo: 'search'},
  {path: 'home', component: HomeComponent},
  {path: 'search', component: SearchComponent},
  {
  path: 'artist/:artistId',
  component: ArtistComponent,
  children: [
  {path: '', redirectTo: 'tracks'}, ①
  {path: 'tracks', component: ArtistTrackListComponent}, ②
  {path: 'albums', component: ArtistAlbumListComponent}, ③
  ]
  },
  {path: '**', component: HomeComponent}
];
  • Если пользователь переходит к say/artist/1234, он будет перенаправлен на /artist/ 1234/tracks.
  • Этот маршрут соответствует URL-адресу, например /artist/ 1234/tracks.
  • Этот маршрут соответствует URL-адресу, например /artist/ 1234/albums.
<h1>Artist</h1>
<p>
  <a [routerLink]="['./tracks']">Tracks</a> |
  <a [routerLink]="['./albums']">Albums</a>
</p>
<router-outlet></router-outlet>