javascript - Angular 2-再次单击routerLink时重新加载组件

标签 javascript angularjs angular angular2-routing

我正在处理具有以下文件结构的 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>

因此,当我在标题 <li><a [routerLink]="['/page1']">Page1</a></li> 中单击 Page1 routerLink 时, 它加载 <router-outlet></router-outlet> 中的 Page1Component .我在表单中填写了一些详细信息,当我在提交表单之前再次单击页眉中的 Page1 routerLink 时,我希望 Page1Component 重新加载,以便我的表单进入初始状态,但它在单击时不执行任何操作。我试图在 routerOnActivate() 中重置表单和 routerCanDeactivate()但是没有调用任何函数。所以基本上,我希望我的组件在我点击 [routerLink] 时再次加载

如果我能解释得更好,请告诉我。

最佳答案

您可以使用虚拟路由来处理这种情况,

<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 处理。

关于javascript - Angular 2-再次单击routerLink时重新加载组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37645368/

相关文章:

javascript - 打字机脚本运行一次后停止运行

javascript - 信号R ASP.NET

angular - 如何不在 Angular DatePipe 月份缩写中显示句点

Angular 2 错误 : Attempt to use a destroyed view: detectChanges Error: Attempt to use a destroyed view: detectChanges at ViewDestroyedError

javascript - Angular 5 仅对模糊进行验证?

javascript - 从 Array 设置背景图片 url

javascript - Bootstrap 日期选择器 : how to add class (e. g。 "month active")到我想强调的特定月份

javascript - jQuery 附加不需要的数据

javascript - 就我而言,如何在运行时填充数据?

输入更改后,AngularJS 清除验证 $error