Angular2-サブモジュールルーティングとネストされた<router-outlet>


82

以下に説明するシナリオのAngular2を使用したソリューションを探しています。

ここに画像の説明を入力してください

このシナリオでは、top-navにはサブモジュールをロードするためのリンクが含まれ、sub-navにはサブモジュールの内容を更新するためのリンクが含まれています。

URLは次のようにマップする必要があります。

  • / home =>主要コンポーネントルーターアウトレットにホームページをロードします
  • / submodule =>サブモジュールをメインコンポーネントルーターアウトレットにロードし、デフォルトでサブモジュールのホームページとサブナビゲーションバーを表示する必要があります
  • / submodule / feature =>サブモジュールのルーターアウトレット内に機能をロードします

アプリモジュール(およびアプリコンポーネント)には、さまざまなサブモジュールに移動するための上部ナビゲーションバーが含まれており、アプリコンポーネントテンプレートは次のようになります。

<top-navbar></top-navbar>
<router-outlet></router-outlet>

しかし、ここに複雑さがあります。サブモジュールには、2番目のレベルのナビゲーションバーと独自のコンポーネントをロードするための独自のルーターアウトレットを備えた同様のレイアウトが必要です。

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>

私はすべてのオプションを試し、どこでも検索しましたが、ルーターアウトレットを備えたサブモジュールにデフォルトのテンプレート(アプリコンポーネントなど)を持ち、サブナビゲーションを失うことなく内部ルーターアウトレットにサブモジュールのコンテンツをロードする解決策を見つけることができませんでした。

ご意見やアイデアをいただければ幸いです


では、現在の設定で正確に何が起こっているのでしょうか?
micronyks 2017年

1
現在の設定では、内部ルーターのコンセントを使用できません。ルーティングはメインルーターアウトレットのサブモジュールコンポーネントもロードし、すべてのサブモジュールコンポーネントテンプレートにはサブナビゲーションが含まれている必要があります
Ron F

1
サブナビゲーションを失うことなく、ネストされたルーターアウトレットの解決策を見つけましたか?私も同様の問題に直面しました。
Saurav 2017

2
ええ、私は同じことに遭遇したと思います。<sub-navbar>は表示されず、routeroutletから出てくるものだけが表示されます。
louisvno

アンギュラ8マルチレベルRouterOutletとRouterModules例はこちらをチェックfreakyjolly.com/...
コードスパイ

回答:


54

HTMLページは次のようになります。

メインページ

<top-navbar></top-navbar>
<router-outlet></router-outlet>

サブモジュールページ

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>

トップナビゲーションバーのナビゲーションをクリックすると、メインルートのコンセントがそれぞれルーティングされます。

サブナビゲーションバーをクリックしている間、router-outlet [sub]はそれぞれルーティングします。

HTMLは問題ありません、トリックはapp.routingを書くことになります

app.routing.ts

const appRoutes: Routes = [
  {
    path: 'login',
    component: LoginComponent
  },
  { path: 'home',
    component: homeComponent,
    children: [
      {
        path: 'module1',
        component: module1Component,
        children: [
          {
            path: 'submodule11',
            component: submodule11Component,
          },
          {
            path: '',
            redirectTo: 'submodule11',
            pathMatch: 'full'
          }
        ]
      },
      {
        path: 'module2',
        component: module2omponent,
        children: [
          {
            path: 'submodule21',
            component: submodule21Component,
          },
          {
            path: '',
            redirectTo: 'submodule21',
            pathMatch: 'full'
          }
        ]
      }
    ]
  },
  {
    path: 'about',
    component: aboutComponent
  }
]

それがあなたを助けることを願っています。

詳細https://angular.io/guide/router


1
はい、あなたのhtmlstrは正しかったです。メインのゲームはapp.routing.tsです。私は同様のアプリケーションを2回実行しました。
Aswin KV 2017

1
答えてくれてありがとう。私は同様のルーティングを試しましたが、私の混乱はそのサブモジュールルーターアウトレットがどこに行くべきかということです。メインモジュールでは、ルーターアウトレットがapp.componentのテンプレートに含まれている必要があることは明らかですが、サブモジュール用のアプリコンポーネントの概念は同じではありません。では、「サブ」ルーターのコンセントはどこに行くのでしょうか。
ロンF

また、サブナビゲーションバーのrouterLinkはどのように見えるべきですか?
ロンF

3
文字列の先頭に「/」を追加する場合、ルーターリンクは文字列である必要があります。「/」を追加しない場合、ルーターリンクは現在のルートを置き換えます。ルートリンクは現在のルートとともに追加されます。それでも明確ではありません。オンラインコーディングプラットフォームでサンプルアプリケーションを作成し、リンクを共有してください
Aswin KV 2017

2
これについては完全にはrouter-outletわかりませんが、ネストされたディレクティブに名前を付ける必要はありません。次に例を示します。github.com
Jess

21

使用する:

RouterModule.forChild()
...
<router-outlet name="sub"></router-outlet>
...
[routerLink]="[{ outlets: { sub: [subRouteName] } }]"

完全な例:

HTML

<div class="tabs tinyscroll">
  <button *ngFor="let tab of tabs"
  [routerLink]="[{ outlets: { sub: [tab.name] } }]"
  routerLinkActive="selected">
    <span>{{ tab.label }}</span>
  </button>
</div>

<section>
  <router-outlet name="sub"></router-outlet>
</section>

app.module.ts

imports: [
...
    RouterModule.forChild([
      {
        path: 'registers',
        component: RegistersComponent,
        children: [
          {path: 'vehicles', component: VehiclesComponent, outlet: 'sub'},
          {path: 'drivers', component: DriversComponent, outlet: 'sub'},
          {path: 'bases', component: BasesComponent, outlet: 'sub'},
          {path: 'lines', component: LinesComponent, outlet: 'sub'},
          {path: 'users', component: UsersComponent, outlet: 'sub'},
          {path: 'config', component: ConfigComponent, outlet: 'sub'},
          {path: 'companies', component: CompaniesComponent, outlet: 'sub'}
        ],
        canActivate: [AuthGuard]
      }
    ]),
...

1
この名前ルートがサポートされているバージョン以降。Bcoz v6で試していますが、機能しません。
SujayUN20年

1
これは、Angularの現在のバージョンでは機能しません。
After_Sunset

0

ルートでアウトレット名を指定する必要があります。この「outlet: 'sub」のように、ルーティングでルーターのアウトレット名を指定します。

routes: Routes = [
  {path:'', redirectTo: 'login', pathMatch: 'full'},
  {
    path: 'login',
    component: LoginComponent,

  },
  { path: 'home',
    component: AppComponent,
      children: [
        {path: 'home/pdf',component: SideMenuPage,outlet:"sub" },
        {path:'home/addFileUp',component:SidePageAdd,outlet:"sub"},
      ]
   },
];

このスニペットはエラーを返します: "Uncaught ReferenceError:LoginComponent is not defined"
Umpa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.