【问题标题】:Angular: how to prevent default router eventAngular:如何防止默认路由器事件
【发布时间】:2021-01-08 23:19:53
【问题描述】:

在我的应用程序组件中,我正在检查路线变化时是否有任何打开的模式。在那种情况下,我想

  • 关闭打开的模态
  • 防止路线更改,因为对于用户而言,关闭模式已经是路线更改...

如果有一个打开的模式,我已经成功关闭,但我找不到使用类似“event.preventDefault()”之类的方法


    export class AppComponent implements OnInit, OnDestroy {
      private routerEventSubscription : Subscription;
      
      constructor (
        private router: Router,
        private modalService: NgbModal
      ) { }
    
      ngOnInit(): void {
        this.routerEventSubscription = this.router.events.pipe(
          filter( event => event instanceof NavigationStart ),
          pairwise()
        ).subscribe( event => {
          console.log(event);
          if (this.modalService.hasOpenModals()) {
            this.modalService.dismissAll();
            /***  ==> Here I want to prevent the route from changing <== ***/
          }
        })
      }
      
      ngOnDestroy () {
        this.routerEventSubscription.unsubscribe();
      }
    }

【问题讨论】:

    标签: angular router preventdefault


    【解决方案1】:

    路由器事件不会帮助您阻止导航,因为它们只是让您知道正在发生的事情的一种手段,为了防止用户离开他们所在的当前路线,您需要使用 canDeactivate 属性路线。

    你可以在这里查看官方文档:https://angular.io/api/router/CanDeactivate

    你可以在网上找到这样的例子/解释:https://www.concretepage.com/angular-2/angular-candeactivate-guard-example

    基本上,您创建一个实现CanDeactivate 接口的守卫,并将该守卫分配给您希望用户离开的应用程序中的所有路由,并在守卫本身中实现您需要的逻辑(您获得当前组件和可以使用它来实现您的逻辑,或者您甚至可以忽略它并使用一些共享服务或您想要的任何东西)。

    【讨论】:

    • 这确实是一个选项。但我希望有一个更通用的解决方案适用于所有路线,而无需为每条路线添加警卫......
    • 是的,我明白了。但我认为您确实需要配置路由以让 Angular 知道如何表现,而且我认为这不能在模块级别完成,因为您通常不想对我认为的所有路由器实现相同的功能。无论如何,我没有尝试过,但我想CanDeactivate 应用于路线也适用于它的所有子路线,因此如果您将所有路线作为应用程序的子路线,您可以将canDeactivate 选项设置为那个。我认为这可行,但我不能 100% 确定,因为我没有尝试过,如果你愿意,可能值得一试:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多