Winkel 2 - Submodul-Routing und verschachteltes <Router-Ausgang>


81

Ich suche nach einer Lösung mit Angular 2 für das unten erläuterte Szenario:

Geben Sie hier die Bildbeschreibung ein

In diesem Szenario enthält das Top-Navi Links zum Laden von Submodulen und das Sub-Navi enthält Links zum Aktualisieren des Inhalts des Submoduls.

Die URLs sollten wie folgt zugeordnet sein:

  • / home => lädt die Homepage in den Router-Ausgang der Hauptkomponente
  • / submodule => lädt das Submodul in den Router-Ausgang der Hauptkomponente und sollte standardmäßig die Homepage und die Subnavigationsleiste des Submoduls anzeigen
  • / submodule / feature => lädt das Feature in den Router-Ausgang des Submoduls

Das App-Modul (und die App-Komponente) enthält eine obere Navigationsleiste, mit der Sie zu verschiedenen Submodulen navigieren können. Die Vorlage für die App-Komponente könnte folgendermaßen aussehen

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

Aber hier ist die Komplexität. Meine Submodule müssen ein ähnliches Layout mit einer Navigationsleiste der zweiten Ebene und einem eigenen Router-Ausgang haben, um ihre eigenen Komponenten zu laden.

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

Ich habe alle Optionen ausprobiert und überall gesucht, konnte jedoch keine Lösung finden, um eine Standardvorlage (wie eine App-Komponente) im Submodul mit Router-Ausgang zu haben und auch den Inhalt des Submoduls in den inneren Router-Ausgang zu laden, ohne das Sub-Navi zu verlieren .

Ich würde mich über Anregungen oder Ideen freuen


Was genau passiert mit dem aktuellen Setup?
Mikronyken

1
Mit dem aktuellen Setup kann ich den inneren Router-Ausgang nicht verwenden. Das Routing lädt sogar Submodul-Komponenten in den Haupt-Router-Ausgang und alle meine Submodul-Komponenten-Vorlagen müssen ein Sub-Nav enthalten
Ron F

1
Haben Sie eine Lösung für verschachtelte Router-Steckdosen gefunden, ohne die Subnavigation zu verlieren? Ich bin in ein ähnliches Problem geraten.
Saurav

2
Ja, ich glaube, ich bin auf dasselbe gestoßen, die <sub-navbar> wird einfach nicht angezeigt, nur was aus dem Routeroutlet kommt.
Louisvno

Suchen Sie hier nach Angular 8 Multilevel RouterOutlet und RouterModules Beispiel freakyjolly.com/…
Code Spy

Antworten:


54

Die HTML-Seite sieht folgendermaßen aus.

Hauptseite

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

Submodul Seite

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

Wenn Sie in der oberen Navigationsleiste auf Navigation klicken, wird der Hauptroutenausgang entsprechend weitergeleitet.

Wenn Sie auf die Unter-Navigationsleiste klicken, wird der Router-Ausgang [Unter] entsprechend weitergeleitet.

HTML ist in Ordnung, der Trick wird beim Schreiben von app.routing kommen

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
  }
]

Hoffe es wird dir helfen.

Weitere Details https://angular.io/guide/router


1
Ja, dein HTML-Str war korrekt. Das Hauptspiel ist mit app.routing.ts. Ich hatte zwei ähnliche Anwendungen zweimal gemacht.
Aswin KV

1
Danke für die Antwort. Ich habe das ähnliche Routing versucht, aber meine Verwirrung ist, wohin sollte dieser Submodul-Router-Ausgang gehen? Auf dem Hauptmodul ist klar, dass sich der Router-Ausgang in der Vorlage von app.component befinden sollte, aber wir haben nicht das gleiche Konzept der App-Komponente für Submodule. Also, wohin geht der "Sub" -Router-Ausgang?
Ron F

Wie sollte der routerLink in der Subnavigationsleiste aussehen?
Ron F

3
Die Router-Verbindung muss eine Zeichenfolge sein, wenn Sie am Anfang der Zeichenfolge '/' hinzufügen. Sie ersetzt die aktuelle Route, wenn Sie nicht '/' hinzufügen. Die Routenverbindung wird mit der aktuellen Route hinzugefügt. Sie sind sich immer noch nicht sicher, bitte erstellen Sie eine Beispielanwendung auf einer Online-Codierungsplattform und teilen Sie den Link
Aswin KV

1
Da bin ich mir nicht ganz sicher, aber die verschachtelte router-outletDirektive muss nicht benannt werden. Hier ist ein Beispiel: github.com/gothinkster/angular-realworld-example-app/blob/…
Jess

21

Verwenden:

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

Vollständiges Beispiel:

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]
      }
    ]),
...

Ab welcher Version diese Namensroute unterstützt wird. Bcoz Ich versuche es in v6 und es funktioniert nicht.
Sujay UN

0

Sie müssen den Outlet-Namen in den Routen angeben. Geben Sie Ihren Router-Outlet-Namen im Routing wie folgt an: "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"},
      ]
   },
];

Dieses Snippet gibt einen Fehler zurück: "Nicht erfasster Referenzfehler: LoginComponent ist nicht definiert"
Umpa
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.