Angular 2 - 当 routerLink 再次点击时重新加载组件
Angular 2 - Reload component when routerLink clicked again
我正在处理具有以下文件结构的 Angular 2 个项目。
- HeaderComponent.ts
- AppComponent.ts
- Page1Component.ts
- Page2Component.ts
我的 HeaderComponent.ts
中有以下模板
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">WebSiteName</a>
</div>
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav">
<li class="active"><a [routerLink]="['']">Home</a></li>
<li><a [routerLink]="['/page1']" >Page1</a></li>
<li><a [routerLink]="['/page2']">Page2</a></li>
</ul>
</div>
</div>
</nav>
在我的 AppComponent 中使用以下路由
@Component({
selector: 'my-app',
template: `
<my-header></my-header>
<router-outlet></router-outlet>
`,
directives: [ROUTER_DIRECTIVES, HeaderComponent]
})
@Routes([
{path: '/', component: HomeComponent},
{path: '/page1', component: Page1Component}
{path: '/page2', component: Page2Component}
])
export class AppComponent {
ngAfterViewInit() {
//To show the active tab in navbar
$(".nav a").on("click", function () {
$(".nav").find(".active").removeClass("active");
$(this).parent().addClass("active");
});
}
}
并且我的 Page1Component 具有以下示例表单
<section class="col-md-8 col-md-offset-2">
<form [ngFormModel]="myForm" (ngSubmit)="onSubmit()">
<div class="form-group">
<label for="firstName">First Name</label>
<input [ngFormControl]="myForm.find('firstName')" type="text" id="firstName" class="form-control">
</div>
<div class="form-group">
<label for="lastName">Last Name</label>
<input [ngFormControl]="myForm.find('lastName')" type="text" id="lastName" class="form-control">
</div>
<div class="form-group">
<label for="email">Mail</label>
<input [ngFormControl]="myForm.find('email')" type="email" id="email" class="form-control">
</div>
<div class="form-group">
<label for="password">Password</label>
<input [ngFormControl]="myForm.find('password')" type="password" id="password" class="form-control">
</div>
<button type="submit" class="btn btn-primary" [disabled]="!myForm.valid">Sign Up</button>
</form>
</section>
因此,当我单击 header <li><a [routerLink]="['/page1']">Page1</a></li>
中的 Page1 routerLink 时,它会加载 <router-outlet></router-outlet>
中的 Page1Component。我在表单中填写了一些详细信息,当我在提交表单之前再次单击 header 中的 Page1 routerLink 时,我希望重新加载 Page1Component 以便我的表单进入初始状态,但它在单击时不执行任何操作。我试图在 routerOnActivate()
和 routerCanDeactivate()
中重置表单,但 none 被调用的函数。所以基本上,我希望在单击 [routerLink]
时再次加载我的组件
如果我能解释得更好,请告诉我。
您可以使用 (click)
事件在代码中导航到某个虚拟组件,然后再次返回到前一个组件。 router.navigate()
中有一个参数可以跳过历史更改,因此后退按钮可以继续使用此 hack。
另一种方法是删除 routerLink,并通过代码导航:
<a (click)="gotoPage1()">
现在转到第 1 页只是将 #X 编号附加到现有 url
...
count: number = 2;
gotoPage1(){
count++;
return this.router.navigate(...'#'+count);
}
您可以使用虚拟路由来处理这种情况,
<a (click)="changeRoute(url)">
向您的路由器添加一条虚拟路由:
{ path: 'dummy', component: dummyComponent }
dummyComponent.ts
//Dummy component for route changes
@Component({
selector: 'dummy',
template: ''
})
export class dummyComponent{}
现在在你的组件中添加 changeRoute 函数:
changeRoute(url) {
this.router.navigateByUrl('/dummy', { skipLocationChange: true });
setTimeout(() => this.router.navigate(url));
}
// 'skipLocationChange' will avoid /dummy to go into history API
这将重新渲染您的组件,其余的将由 Angular 处理。
我正在处理具有以下文件结构的 Angular 2 个项目。
- HeaderComponent.ts
- AppComponent.ts
- Page1Component.ts
- Page2Component.ts
我的 HeaderComponent.ts
中有以下模板<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">WebSiteName</a>
</div>
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav">
<li class="active"><a [routerLink]="['']">Home</a></li>
<li><a [routerLink]="['/page1']" >Page1</a></li>
<li><a [routerLink]="['/page2']">Page2</a></li>
</ul>
</div>
</div>
</nav>
在我的 AppComponent 中使用以下路由
@Component({
selector: 'my-app',
template: `
<my-header></my-header>
<router-outlet></router-outlet>
`,
directives: [ROUTER_DIRECTIVES, HeaderComponent]
})
@Routes([
{path: '/', component: HomeComponent},
{path: '/page1', component: Page1Component}
{path: '/page2', component: Page2Component}
])
export class AppComponent {
ngAfterViewInit() {
//To show the active tab in navbar
$(".nav a").on("click", function () {
$(".nav").find(".active").removeClass("active");
$(this).parent().addClass("active");
});
}
}
并且我的 Page1Component 具有以下示例表单
<section class="col-md-8 col-md-offset-2">
<form [ngFormModel]="myForm" (ngSubmit)="onSubmit()">
<div class="form-group">
<label for="firstName">First Name</label>
<input [ngFormControl]="myForm.find('firstName')" type="text" id="firstName" class="form-control">
</div>
<div class="form-group">
<label for="lastName">Last Name</label>
<input [ngFormControl]="myForm.find('lastName')" type="text" id="lastName" class="form-control">
</div>
<div class="form-group">
<label for="email">Mail</label>
<input [ngFormControl]="myForm.find('email')" type="email" id="email" class="form-control">
</div>
<div class="form-group">
<label for="password">Password</label>
<input [ngFormControl]="myForm.find('password')" type="password" id="password" class="form-control">
</div>
<button type="submit" class="btn btn-primary" [disabled]="!myForm.valid">Sign Up</button>
</form>
</section>
因此,当我单击 header <li><a [routerLink]="['/page1']">Page1</a></li>
中的 Page1 routerLink 时,它会加载 <router-outlet></router-outlet>
中的 Page1Component。我在表单中填写了一些详细信息,当我在提交表单之前再次单击 header 中的 Page1 routerLink 时,我希望重新加载 Page1Component 以便我的表单进入初始状态,但它在单击时不执行任何操作。我试图在 routerOnActivate()
和 routerCanDeactivate()
中重置表单,但 none 被调用的函数。所以基本上,我希望在单击 [routerLink]
如果我能解释得更好,请告诉我。
您可以使用 (click)
事件在代码中导航到某个虚拟组件,然后再次返回到前一个组件。 router.navigate()
中有一个参数可以跳过历史更改,因此后退按钮可以继续使用此 hack。
另一种方法是删除 routerLink,并通过代码导航:
<a (click)="gotoPage1()">
现在转到第 1 页只是将 #X 编号附加到现有 url
...
count: number = 2;
gotoPage1(){
count++;
return this.router.navigate(...'#'+count);
}
您可以使用虚拟路由来处理这种情况,
<a (click)="changeRoute(url)">
向您的路由器添加一条虚拟路由:
{ path: 'dummy', component: dummyComponent }
dummyComponent.ts
//Dummy component for route changes
@Component({
selector: 'dummy',
template: ''
})
export class dummyComponent{}
现在在你的组件中添加 changeRoute 函数:
changeRoute(url) {
this.router.navigateByUrl('/dummy', { skipLocationChange: true });
setTimeout(() => this.router.navigate(url));
}
// 'skipLocationChange' will avoid /dummy to go into history API
这将重新渲染您的组件,其余的将由 Angular 处理。