在自定义验证器指令中注入 ngControl,导致循环依赖

Posted

技术标签:

【中文标题】在自定义验证器指令中注入 ngControl,导致循环依赖【英文标题】:Injecting ngControl in custom validator directive, causes cyclic dependency 【发布时间】:2017-02-10 01:38:56 【问题描述】:

我正在尝试创建自定义 angular 2 验证器指令,它像这样注入 NgControl:

@Directive(
  selector: '[ngModel][customValidator]',
  providers: [provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true]
)
export class CustomValidatorDirective implements Validator 
  private validateFunction: ValidatorFn;

  constructor(private control: NgControl)  ;


但我收到以下错误:

无法实例化循环依赖! NgControl

有谁知道我如何解决它,以便在初始化后访问 ngControl?

【问题讨论】:

你用的是哪个版本? 版本为2.0.0 你能从这里删除 providers 部分并将其添加到 @NgModel() 中吗? 感谢@micronyks,看来这解决了问题。 【参考方案1】:

Providers, Pipes, Directives 声明已从 @Component@Directive 中删除RC6RC7 之后的 装饰器。所以你只需要删除

providers: [provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true] 

来自指令

并将其添加到 @NgModule() 装饰器

@NgModule(
 ...
 providers: [provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true]

)

【讨论】:

AFAIK providers 指令上的属性仍然有效。它没有被删除github.com/angular/angular/blob/master/modules/%40angular/core/…angular.io/docs/ts/latest/cookbook/… @yurzui 感谢分享。那么问题可能是不在这里提供这样的提供者配置。或者可能在这里提供提供者可能会创建其他实例或其他东西。 我认为将提供者注册放在 NgModule 而不是指令中会导致验证器在可以访问 CustomValidatorDirective 的模块之间共享。显然,当其他指令也使用它时,它会污染 NG_VALIDATORS。【参考方案2】:

您可以通过 Injector 注入 NgControl 以避免循环依赖。

constructor(private _injector: Injector)  

ngOnInit() 
  console.log(this._injector.get(NgControl))

【讨论】:

injector.get(NgControl) 好像贬值了。请参阅 this 了解替代解决方案。

以上是关于在自定义验证器指令中注入 ngControl,导致循环依赖的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义 Spring Security 登录成功处理程序中注入会话 bean

Angular 2 - 使用带有可选字段的 ngControl

等待组件在自定义 svelte 指令中准备就绪

在自定义指令的范围绑定中使用符号“@”、“&”、“=”和“>”:AngularJS

如何在自定义组件宿主元素上使用自定义指令

如何使用 ControlValueAccessor Angular 在自定义输入中使用指令