Angular2 router.navigate重新加载应用程序

时间:2016-03-25 20:11:16

标签: angular angular2-routing

我在我的应用程序中定义了以下路线...

app.components.ts
@RouteConfig([
  {path:'/employees/...', name:'Employees', component:EmployeeComponent},
  ...

employee.component.ts
@RouteConfig([
  {path:'/', name:'EmployeeList', component:EmployeeListComponent, useAsDefault: true},
  {path:'/:id', name:'EmployeeDetail', component:EmployeeDetailComponent}
])

当我从EmployeeDetailComponent模板路由时......

<button class="btn btn-default" [routerLink]="['EmployeeList']">Close</button>

应用程序按预期路由到员工列表页面。

但是,当我使用router.navigate ...

进行路由时
// template
<button class="btn btn-default" (click)="save()">Save</button>

// EmployeeDetailComponent
saveEmployee() {
  this._employeeServer.updateEmployee(this.employee);
  this._router.navigate(['EmployeeList']);
}

应用程序路由员工列表(如预期的那样),然后,片刻之后,应用程序完全重新加载(不像预期的那样)。

知道为什么router.navigate的行为与routerLink不同?我错过了什么?

3 个答案:

答案 0 :(得分:10)

<button>内的

<form>可能正在尝试提交。尝试添加<button type="button">以防止在点击按钮时提交。

答案 1 :(得分:6)

您可以使用此指令:

@Directive({
  selector: `click-stop-propagation`
  events: 'stopClick($event)'
})
class ClickStopPropagation {
  stopClick(event:Event) {
    event.preventDefault();
    event.stopPropagation();
  }
}

并以这种方式应用:

<button class="btn btn-default"
    (click)="save()" click-stop-propagation>Save</button>

另一种解决方案是将事件传递给save方法:

<button class="btn btn-default"
    (click)="save($event)" click-stop-propagation>Save</button>

并使用它来停止事件传播:

save(event) {
  this._employeeServer.updateEmployee(this.employee);
  this._router.navigate(['EmployeeList']);
  event.preventDefault();
  event.stopPropagation();
}

答案 2 :(得分:1)

虽然蒂埃里对取消事件传播的回答对我有用,但我找到了另一种解决方案;

尝试在超时(任何持续时间)中包装导航

...
setTimeout(() => {
    this._router.navigate(['EmployeeList']);
}, 0);
...

你是否觉得这个整洁而不是包括一个点击事件是有争议的。对我来说,无论如何我想延迟导航等待动画,这样就省去了包含一个多余的点击事件。