防止在具有 routerLink 的锚点上导航

Prevent navigation on anchor that has routerLink

在我的标记中,有 [routerLink]="(onLink | async).linkURL"

当它出现时,当用户点击它时,我无法阻止导航发生。

如果我删除 [routerLink]="(onLink | async).linkURL",导航将按预期停止。

有什么办法可以停止这里的导航吗?我无法从标记中删除 [routerLink]="(onLink | async).linkURL"

我下面的 js 在 angular 上下文中不是 运行 顺便说一句,它是普通的 js。

Html ..

<div>
    <a id="myLink" [routerLink]="(onLink | async).linkURL">My link</a>
</div>

Javascript ..

document.getElementById('myLink').addEventListener('click', function(event) {
  console.log('click');
  event.preventDefault();
  event.stopPropagation();
});

如果您真的无法删除 [routerLink] 并将其替换为 (click) 侦听器来处理 class 方法中的逻辑,不妨试试这个。在你的组件中 class:

shouldNavigate: boolean = false; // indicated whether it is possible to navigate
constructor(public route: ActivatedRoute) {} 

在 HTML 模板中:

<a [routerLink]="shouldNavigate ? (onLink | async).linkURL : route.url">My link</a>

在Angular中,如果锚点指向用户现在所在的同一个url,导航将不会发生,因此根据情况,将url更改为当前页面的 url 并完成它。

其他选项:您可以编写一个指令来处理导航等。让我知道这个答案是否不够令人满意,所以我可能会选择另一种方法。这是迄今为止最懒惰的。

Angular 从给定路线 enable/disable 导航的标准方法是实施 CanDeactivate route guard。同样,您可以实现 CanActivate 路线守卫,以 enable/disable 导航到给定路线。

CanDeactivate 路由守卫的示例显示在 this stackblitz 中,其中复选框的状态允许或阻止从 "Home"页。

在app.module中:

import { AppRoutingModule } from './app.routing.module';
import { DeactivateGuard } from './views/home/deactivate-guard';

@NgModule({
  imports: [ 
    AppRoutingModule, 
    ... 
  ],
  providers: [
    DeactivateGuard
  ],
  ...
})

在app.routing.module中:

import { RouterModule } from '@angular/router';
import { DeactivateGuard } from './views/home/deactivate-guard';

@NgModule({
  imports: [
    RouterModule.forRoot([
      ...
      {
        path: 'home',
        component: HomeViewComponent,
        canDeactivate: [DeactivateGuard]
      },
      ...
    ])
  ],
  exports: [
    RouterModule,
  ],
  ... 
})

在home/deactivate-guard中:

import { CanDeactivate } from '@angular/router';
import { HomeViewComponent } from './home.component';

export class DeactivateGuard implements CanDeactivate<HomeViewComponent> {

  canDeactivate(component: HomeViewComponent) {
    return component.canDeactivate();
  }
}

在home.component中:

export class HomeViewComponent {

  allowNavigation = true;

  canDeactivate() {
    return this.allowNavigation;
  }
}

您可以在组件上使用此导航逻辑。您可以添加 (click)=" method()" 方法 锚标记并在组件方法上添加逻辑。我遇到了这个问题并在组件上添加了逻辑并使用 return 以防我想停止导航。

我在组件中使用了路由器。 this.router.navigate([]);