有啥方法可以防止以角度破坏组件?

Posted

技术标签:

【中文标题】有啥方法可以防止以角度破坏组件?【英文标题】:Is there any way to prevent destroying a component in angular?有什么方法可以防止以角度破坏组件? 【发布时间】:2018-07-08 22:31:32 【问题描述】:

我们知道 Angular 中有一个方法 ngOnDestroy() 可以在销毁组件时运行,但我想知道有什么方法可以防止它被破坏?

【问题讨论】:

你能解释一下你到底在做什么吗?看起来像一个 XY 场景...... 你能指定任何场景吗 canDeactivate 路由器保护 这样做并不明智,因为它有助于解决任何内存泄漏问题。如果您创建了任何东西,并且它不应该在其他路线上,那么就像某些订阅一样,这是在ngOnDestroy() 中销毁它的明确候选者。 查看这个 *** 答案以获得详细的代码示例。 ***.com/a/62409873/4109794 【参考方案1】:

CanDeactivate 守卫可以访问活动组件的实例,因此您可以实现一个 hasChanges() 来检查是否有更改并有条件地请求用户离开前确认。 在以下示例中,CanDeactivateComponent 实现了方法 hasChanges(),该方法返回一个布尔值,指示组件是否检测到任何更改。 CanDeactivate 守卫的实现类似于 CanActivate 守卫 implelementaion(您可以创建一个函数,或者一个实现 CanDeactivate 接口的类):

import  CanDeactivate  from '@angular/router';
import  CanDeactivateComponent  from './app/can-deactivate';

export class ConfirmDeactivateGuard implements CanDeactivate<CanDeactivateComponent> 

  canDeactivate(target: CanDeactivateComponent) 
  
    if(target.hasChanges())
      return window.confirm('Do you really want to cancel?');
    
    return true;
  

尽管这是一个非常简单的实现,CanDeactivate 使用的是泛型,因此您需要指定要停用的组件类型。

在组件的Angular路由器中:

 
  path: '',
  component: SomeComponent,
  canDeactivate: [ConfirmDeactivateGuard]

最后,与 Angular 上的所有其他服务一样,需要相应地注册此守卫:

@NgModule(
  ...
  providers: [
    ...
    ConfirmDeactivateGuard
  ]
)
export class AppModule 

您可以让多个守卫保护单个路由,这有助于您实施复杂的用例,其中需要一系列不同的检查。

【讨论】:

以上是关于有啥方法可以防止以角度破坏组件?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以防止杰克逊中的字段反序列化?

有啥方法可以防止大于特定大小的文件被上传? [复制]

有啥方法可以防止 android/ios 上的非法位置?

有啥方法可以防止类的动态分配?

有啥方法需要防止 url 注入?

如果通过 Mongoose 在 Mongodb 的另一个文档中存在引用,有啥更好的方法可以防止文档被删除?