Angular 2 routerlink 更改时不调用 ngOnInit
Angular 2 ngOnInit is not called when routerlink changes
我有一个菜单栏,其中包含从 express api 加载的菜单列表,每个菜单都引用了一个具有别名的页面该页面的 URL
我试图在单击菜单时加载页面,它已完成,但仅在我刷新页面时
这是我的菜单代码
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();
}
}
这是我的模板菜单
<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 -->
我认为问题出在我的页面组件的 ngOnInit 上,它没有被调用
@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);
});
}
}
这是我的页面模板
<p *ngIf="page" [innerHTML]="page.content" ></p>
这是我的应用路由代码
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 {}
这是我的应用组件
@Component({
selector: 'my-app',
template: `
<menu-list></menu-list>
<hr>
`
})
export class AppComponent {
}
Home of application with the menu bar
当只有一个路由器参数发生变化但路由的基础保持不变时,Angular 会重用该组件。 ngOnInit()
只在组件实例化后调用一次,路由变化时不会调用
您可以注入路由器并订阅它的事件或参数以获得有关路由更改的通知。
以下是 Gunter 所说内容的代码示例:
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.route.params.subscribe(
params => {
let id= +params['id'];
this.getProduct(id);
});
}
此代码监视参数的变化并执行箭头函数内的任何代码。
感谢@Günter Zöchbauer 和@DeborahK,它已修复
我从这个
更改了页面组件代码
@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);
});
}
}
到这个
@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 {
this.pageService.getPage(this.alias).subscribe(page => {
this.page = page;
console.log(this.page);
});
}
}
import { Router } from '@angular/router';
...
export class SettingViewComponent implements OnInit {
constructor(
private router: Router
) { }
public ngOnInit(): void {
this.router.routeReuseStrategy.shouldReuseRoute = () => false;
}
我有一个菜单栏,其中包含从 express api 加载的菜单列表,每个菜单都引用了一个具有别名的页面该页面的 URL 我试图在单击菜单时加载页面,它已完成,但仅在我刷新页面时 这是我的菜单代码
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();
}
}
这是我的模板菜单
<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 -->
我认为问题出在我的页面组件的 ngOnInit 上,它没有被调用
@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);
});
}
}
这是我的页面模板
<p *ngIf="page" [innerHTML]="page.content" ></p>
这是我的应用路由代码
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 {}
这是我的应用组件
@Component({
selector: 'my-app',
template: `
<menu-list></menu-list>
<hr>
`
})
export class AppComponent {
}
Home of application with the menu bar
当只有一个路由器参数发生变化但路由的基础保持不变时,Angular 会重用该组件。 ngOnInit()
只在组件实例化后调用一次,路由变化时不会调用
您可以注入路由器并订阅它的事件或参数以获得有关路由更改的通知。
以下是 Gunter 所说内容的代码示例:
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.route.params.subscribe(
params => {
let id= +params['id'];
this.getProduct(id);
});
}
此代码监视参数的变化并执行箭头函数内的任何代码。
感谢@Günter Zöchbauer 和@DeborahK,它已修复 我从这个
更改了页面组件代码@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);
});
}
}
到这个
@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 {
this.pageService.getPage(this.alias).subscribe(page => {
this.page = page;
console.log(this.page);
});
}
}
import { Router } from '@angular/router';
...
export class SettingViewComponent implements OnInit {
constructor(
private router: Router
) { }
public ngOnInit(): void {
this.router.routeReuseStrategy.shouldReuseRoute = () => false;
}