2017-08-24 6 views
2

Ich habe eine Menüleiste enthalten Menüs von express API geladen und jedes Menü ist auf Seite verwiesen, die einen Alias ​​haben, der die URL dieser Seite sein wird ich versuche, die Seite zu laden wenn ich zum Menü klicken, wird es getan, aber nachdem ich die Seite dieses mein Menü CodeAngular 2 ngOnInit wird nicht aufgerufen, wenn routerlink ändert

export class MenuList implements OnInit { 

menus:Menu[]; 
menu:Menu; 
page:Page; 

constructor(private router:Router, 
      private menuService:MenuService) { 
} 

getMenus():void { 
    this.menuService.getMenus() 
     .subscribe(
      menus => this.menus = menus, //Bind to view 
      err => { 
       // Log errors if any 
       console.log(err); 
      } 
     ); 
} 

getPage(id):void { 
    this.menuService.getPage(id) 
     .subscribe(
      page => this.page = page, //Bind to view 
      err => { 
       // Log errors if any 
       console.log(err); 
      }); 
} 

ngOnInit():void { 
    this.getMenus(); 
} 

}

und das ist meine Vorlage Menü

auffrischen
<div class="container-fluid"> 
    <!-- Brand and toggle get grouped for better mobile display --> 
    <div class="navbar-header"> 
     <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false"> 
      <span class="sr-only">Toggle navigation</span> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
     </button> 
    </div> 

    <!-- Collect the nav links, forms, and other content for toggling --> 
    <div class="collapse navbar-collapse" id="navbar" style="background-color: #97455f"> 
     <div class="navv"> 
      <ul *ngFor="let menu of menus"> 
       <li class="col-lg-1 col-md-1 col-xs-12 col-sm-12"><a [routerLink]="[menu.page.alias]">{{menu.title}}</a></li> 


      </ul> 
     </div> 
    </div> 

</div><!-- /.navbar-collapse --> 

denke ich, das Problem in der ngOnInit meiner Seite Komponente ist, ist es nicht

@Component({ 
    selector: 'page', 
    templateUrl: './page.component.html' 
}) 
export class PageComponent implements OnInit { 
    alias: string; 
    page:Page; 

    constructor(private router:Router, 
       private route: ActivatedRoute, 
       private pageService:PageService) { 

     this.route.params.subscribe(
      (params : Params) => { 
       this.alias = params["alias"]; 
       console.log(this.alias) 
      } 
     ); 
    } 




    ngOnInit():void { 
     debugger; 
     this.pageService.getPage(this.alias).subscribe(page => { 
      this.page = page; 
      console.log(this.page); 
     }); 
    } 

} 

genannt wird, und das ist meine Seite Vorlage

<p *ngIf="page" [innerHTML]="page.content" ></p> 

dies ist mein App-Routing-Code

const routes: Routes = [ 
    { path: '', redirectTo: '/home', pathMatch: 'full' }, 
    { path: ':alias', component: PageComponent }, 
    { path: 'archived', component: ArchivedComponent }, 
    { path: 'home', component: HomeComponent }, 
    { path: 'menu', component: MenuList }, 
    { path: 'detail/:id', component: ActualiteDetailComponent }, 
    { path: 'contact', component: ContactComponent }, 

]; 

@NgModule({ 
    imports: [ RouterModule.forRoot(routes) ], 
    exports: [ RouterModule ] 
}) 
export class AppRoutingModule {} 

das ist meine App Komponente

@Component({ 
    selector: 'my-app', 
    template: ` 
    <menu-list></menu-list> 
    <hr> 
` 

}) 
export class AppComponent { 

} 

Home of application with the menu bar

+0

Durch die Art und Weise. Die Reihenfolge der Routen ist wichtig. Geht in Ihrer App keine Route durch "PageComponent"? Zum Beispiel zu Hause, Menü oder Kontakt. Ich meine, eine spezifischere Route sollte oben und unten breiter sein. –

+2

Ich bin nicht in der Lage, aus Ihrer Frage abzuleiten, welcher Code/html gekappt zu welcher Komponente gehört oder welchen Routennamen 'menu.page.alias' zurückgibt. –

+0

Sharikov Vladislav, yep, alle Menü-URL gehen vom Alias ​​zur PageComponent, mein Problem, dass der Inhalt der Seite nicht geladen wird, wenn ich in der Menüliste klicke, aber wenn ich die Seite aktualisiere, wird geladen –

Antwort

5

Hier ist ein Codebeispiel dessen, was Gunter spricht:

constructor(private route: ActivatedRoute) { } 

    ngOnInit() { 
    this.route.params.subscribe(
    params => { 
     let id= +params['id']; 
     this.getProduct(id); 
    }); 
    } 

Dieser Code für Änderungen der Parameter beobachtet und führt beliebigen Code innerhalb der Pfeilfunktion.

+0

danke @DeborahK, du hast mein Leben gerettet: D –

1

Wenn nur eine Router Parameteränderung ist aber die Basis der Strecke bleibt gleich, Angular wieder verwendet die Komponente. ngOnInit() wird nur einmal aufgerufen, nachdem eine Komponente instanziiert wurde, aber nicht, wenn sich die Route ändert.

Sie können den Router injizieren und seine Ereignisse oder Parameter abonnieren, um sich über Routenänderungen zu informieren.

+1

ja aber wie? sollte ich etwas anderes anstelle von ngOnInit verwenden? Resolver zum Beispiel? –

+1

Sie können 'route: ActivatedRoute' injizieren und route.subscribe (...) ' –

+0

Vielen Dank Mann –

1

Nun, es fixiert dank @ Günter Zöchbauer und @DeborahK geändert ich die Seite Component Code aus diesem

 @Component({ 
    selector: 'page', 
    templateUrl: './page.component.html' 
}) 
export class PageComponent implements OnInit { 
    alias: string; 
    page:Page; 

    constructor(private router:Router, 
       private route: ActivatedRoute, 
       private pageService:PageService) { 

     this.route.params.subscribe(
      (params : Params) => { 
       this.alias = params["alias"]; 
       console.log(this.alias) 
      } 
     ); 
    } 

ngOnInit():void { 
     debugger; 
     this.pageService.getPage(this.alias).subscribe(page => { 
      this.page = page; 
      console.log(this.page); 
     }); 
    } 
} 

zu diesem

@Component({ 
    selector: 'page', 
    templateUrl: './page.component.html' 
}) 
export class PageComponent implements OnInit { 
    alias:string; 
    page:Page; 

    constructor(private router:Router, 
       private route:ActivatedRoute, 
       private pageService:PageService) { 

     this.route.params.subscribe(
      (params:Params) => { 
       this.alias = params["alias"]; 
       this.pageService.getPage(this.alias).subscribe(page => { 
        this.page = page; 
        console.log(this.page); 
       }); 
       console.log(this.alias) 
      } 
     ); 
    } 
    ngOnInit():void { 
     debugger; 
     this.pageService.getPage(this.alias).subscribe(page => { 
      this.page = page; 
      console.log(this.page); 
     }); 
    } 
} 
+1

Froh, dass es für Sie arbeitet. Ziehen Sie in Betracht, den Code vom Konstruktor in ngOnInit zu verschieben. Code zum Abrufen von Daten sollte nicht in einem Konstruktor sein. Außerdem müssen Sie den getPage-Methodenaufruf in Ihrem ngOnIt nicht wiederholen. – DeborahK

+0

Oh! Ja. Ich habe vergessen, es zu löschen. Vielen Dank –

Verwandte Themen