首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角6:如何注册canDeactivate防所有线路

角6:如何注册canDeactivate防所有线路
EN

Stack Overflow用户
提问于 2018-09-14 09:20:48
回答 3查看 2.2K关注 0票数 1

我有一个canDeactivate保护程序来检查路由(组件)是否可以停用。当我在路上使用它的时候,效果很好。

代码语言:javascript
复制
const routes: Routes = [
  { path: '', component: MyComponent, canDeactivate: [MyGuard] }
]

我希望这个canDeactivate保护被应用在我的应用程序中的所有路径上,不管它们是否是延迟加载/预加载/加载应用程序。

注意:我不想在我所有的路线上给这个警卫写信。

是否有任何可观察的,EvenEmitter或其他的东西,我可以订阅和更新路线,通过遍历所有的路线?

而且,任何遍历遍历所有路由的代码都是有帮助的。

注意:当子路由更改时, CanDeactivate不会被调用。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2021-12-08 09:58:02

代码语言:javascript
复制
  {
    path: '',
    component: LayoutBasicComponent,
    canActivate: [AuthGuard],
    canDeactivate: [CanLeaveProvide],
    runGuardsAndResolvers: 'paramsOrQueryParamsChange',
    children: [
      { path: '/path1', component: MyComponent1 }
    ]
  },
票数 1
EN

Stack Overflow用户

发布于 2018-09-14 09:25:17

像这样的事情可以完成任务:

代码语言:javascript
复制
const routes: Routes = [
  { path: '', canDeactivate: [MyGuard], children: [
    { path: 'cmp1', component: MyComponent1 },
    { path: 'cmp2', component: MyComponent2 },
    { path: 'lazy', loadChildren: './modules/lazy/lazy.module#LazyModule' },
  ] },
];

只需添加一个根路由和所有其他路由作为它的子路由。

票数 0
EN

Stack Overflow用户

发布于 2021-12-15 17:02:37

我已经找到了一种替代的方法,在中添加一个保护,动态地添加到,任何来自任何组件的路由或子组件(这是非常有用的)。

例如,您可以创建自己的保护机制,这将防止您在此link之后出现意外的窗口关闭。

考虑到这个例子,假设这个守卫名为:"DownloadCenterGuard".它的目的是防止您的浏览器关闭,如果下载正在运行。

但是作为一个角度的开发人员,实际的问题是您的DownloadCenterComponent是一个深子组件,它不知道它包含在哪个主组件中(并且您不想手动将保护添加到所有路由中)。

所以真正的问题是:,我们如何才能在角度上做到这一点?(它非常适合于角度12和更低的角度,以证实未来版本)

从您的子组件(在您的应用程序的任何位置)中,将ActivatedRoute注入构造函数:

代码语言:javascript
复制
@Component(...)
export class DownloadCenterComponent implements OnDestroy {

    constructor(
        private _activatedRoute: ActivatedRoute
    ) {
        // You could do the same for the "canActivate" property.
        this._activatedRoute.routeConfig.canDeactivate = [
            ...this._activatedRoute.routeConfig.canDeactivate,
            DownloadCenterGuard
        ];
    }
    
    ngOnDestroy() {
        // Remove the dynamically added guard at component destroying.
        this._activatedRoute.routeConfig.canDeactivate = [
            ...this._activatedRoute.routeConfig.canDeactivate.filter(guard => guard !== DownloadCenterGuard)
        ]
    }

}

tadaaam,这在任何地方都没有记载,而且它可能在任何时候都得不到角质小组的支持。因此,尽量少使用,,只有您没有其他选择(在我看来)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52328811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档