2016-11-01 4 views
4

abonnieren Ich habe ein Problem mit dem Routing in einer Master/Detailansicht. Wenn ich auf die Route gehe /master sollte die InfoComponent einige allgemeine Informationen zeigen. Und wenn ich gehe zu /master/1 die DetailsComponent sollte einige Daten für das Element mit ID 1 zeigen. In beiden Fällen sollte MasterComponent entweder die ausgewählte ID oder nichts zeigen.Untergeordnete Route Änderungen in Master/Detailbeispiel in Angular 2

Ich kann das ziemlich gut funktionieren. Aber das Problem ist, dass ich auf die ausgewählten :id in OnInit in MasterComponent abonnieren möge, so dass ich es dort hervorheben kann, etwa so:

this.selectedId = this.route.params.map((params: Params) => params["id"]) 

Aber das funktioniert nicht, da :id eine param Kind Route ist. Und ich kann this.route.firstChild nicht verwenden, da firstChild eine andere Route sein wird, abhängig davon, ob InfoComponent oder DetailsComponent angezeigt wird.

Kann ich eine Observable (von :id) bekommen, die sich ändert, wenn sich MasterComponent zwischen dem Anzeigen der beiden untergeordneten Komponenten ändert?

Das ist mein Routing-Modul:

@NgModule({ 
    imports: [ 
     RouterModule.forChild([ 
      { 
       path: "master", 
       canActivate: [AuthenticationGuardService], 
       children: [ 
        { 
         path: "", 
         component: MasterComponent, 
         children: [ 
          { 
           path: "", 
           component: InfoComponent 
          }, 
          { 
           path: ":id", 
           component: DetailsComponent 
          } 
         ] 
        } 
       ] 
      } 
     ]) 
    ], 
    exports: [ 
     RouterModule 
    ] 
}) 
export class MyRoutingModule { } 

Also, was Ich mag würde, ist wie etwas zu tun:

this.selectedId = this.route.params.map((params: Params) => params["id"]) 

Wo this.selectedId ein Observable ist, der den Wert hat 1, wenn die Route /master/1 ist oder der Wert null, wenn die Route /master ist.

Antwort

1

Entweder

this.route.firstChild.params.map(...) 

oder einen Shared-Service verwenden, um die params Änderungen vom Kind zum Vater zu kommunizieren. Beispiele finden Sie unter https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service.

+0

Ok. Ja, 'firstChild' funktioniert nicht wirklich, da es je nachdem, welche der untergeordneten Komponenten aktiv ist, unterschiedlich sein wird. Ich hatte gehofft, dass ich Änderungen irgendwie abonnieren könnte, wenn die URL von '/ master/1' zu'/master' in der 'MasterComponent' wechselt. Also kann ich das nicht wirklich tun, ohne Logik in die Kindkomponenten einzubeziehen? Das ist ein bummer ...:/ – Joel

+0

Sie können die Informationen von 'firstChild' erhalten, welche Komponente es tatsächlich hinzufügen und die Paramänderungen für Komponenten ignorieren, die Sie nicht interessieren. –

+1

Ich werde einen Plünderer gründen, um zu beschreiben, was ich meine :) – Joel

Verwandte Themen