简体   繁体   English

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

[英]Angular 2 - Reload component when routerLink clicked again

I am working on Angular 2 project with following file structure. 我正在使用以下文件结构的Angular 2项目。

  • HeaderComponent.ts HeaderComponent.ts
  • AppComponent.ts AppComponent.ts
  • Page1Component.ts Page1Component.ts
  • Page2Component.ts Page2Component.ts

I have following template in my HeaderComponent.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>

with following routes in my AppComponent 在我的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");
        });
    }
}

and my Page1Component has following sample form 我的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>

So when I click on Page1 routerLink in header <li><a [routerLink]="['/page1']">Page1</a></li> , it loads the Page1Component in <router-outlet></router-outlet> . 因此,当我点击标题<li><a [routerLink]="['/page1']">Page1</a></li> Page1 routerLink时,它会在<router-outlet></router-outlet>加载Page1Component <router-outlet></router-outlet> I fill some details in form and when I click on Page1 routerLink again in header before submitting the form, I want Page1Component to reload so my form comes to initial state but it doesn't do anything on click. 我在表单中填写了一些细节,当我在提交表单之前再次在页眉中点击Page1 routerLink时,我希望Page1Component重新加载,所以我的表单进入初始状态,但它在点击时没有做任何事情。 I tried to reset form in routerOnActivate() and routerCanDeactivate() but none of the functions being called. 我试图在routerOnActivate()routerCanDeactivate()重置表单,但没有调用任何函数。 So basically, I want my component to load again when I click on [routerLink] 所以基本上,当我点击[routerLink]时,我希望我的组件再次加载

Please let me know if I can explain better. 如果我能更好地解释,请告诉我。

You can take care of this scenario by using dummy route, 您可以使用虚拟路径来处理这种情况,

<a (click)="changeRoute(url)">

Add one dummy route to your router: 添加一个虚拟路由到您的路由器:

{ path: 'dummy', component: dummyComponent }

dummyComponent.ts dummyComponent.ts

//Dummy component for route changes

@Component({
    selector: 'dummy',
    template: ''
})
export class dummyComponent{}

Now inside your component add changeRoute function: 现在在组件内添加changeRoute函数:

changeRoute(url) {
  this.router.navigateByUrl('/dummy', { skipLocationChange: true });
  setTimeout(() => this.router.navigate(url));
}
// 'skipLocationChange' will avoid /dummy to go into history API

This will re render your component and rest all will be taken care by Angular. 这将重新渲染你的组件和休息所有将由Angular照顾。

You could use the (click) event an navigate in code to some dummy component and then again back to the previous component. 您可以使用(click)事件在代码中导航到某个虚拟组件,然后再次返回到上一个组件。 There is a parameter in router.navigate() to skip history changes so the back button keeps working with this hack. router.navigate()有一个参数可以跳过历史记录更改,因此后退按钮可以继续使用此hack。

Another approach would be to remove the routerLink, and naviagate via code: 另一种方法是通过代码删除routerLink和naviagate:

<a (click)="gotoPage1()">

Now gotoPage1 just appends a #X number to existing url 现在gotoPage1只是在现有网址上附加一个#X号码

...
count: number = 2;
gotoPage1(){
 count++;
 return this.router.navigate(...'#'+count);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 页面重载时如何不重载组件 Angular - How not to reload component when page is reloading Angular Angular 2使用组件属性动态设置routerLink - Angular 2 dynamically set routerLink using a component property 在基础html中Angular 2中组件模板之外的routerLink - routerLink outside of component template in Angular 2, in base html 如何将 Storybook 与使用 [routerLink] (Angular) 的组件一起使用? - How to use Storybook with a component using [routerLink] (Angular)? Angular 2在子组件中为[routerLink]模板化的正确方法 - Angular 2 proper way to template a [routerLink] in a child component 在Angular 2+中,我可以检测到何时将指令(如routerLink)应用于我的自定义组件吗? - In Angular 2+, can I detect when a directive (like routerLink) is applied to my custom component? 确定单击的组件是否具有routerLink属性的正确方法是什么? - What is a correct way to determine if clicked component has routerLink attribute? 父组件和其他父子组件之间的Angular 5 routerLink - Angular 5 routerLink between parent component and other parent - child component 如何仅在用户登录时完全重新加载 Angular 组件? - How to fully reload an Angular component only when user is logged in? 如何在 VueJs 中再次加载(重新加载)组件或销毁它并再次加载? - How to load again(reload) component in VueJs or destroy it and load again?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM