2016-10-01 60 views
1

我想要创建自定义角2验证指令,它注入NgControl这样的:在自定义的验证指令注入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) { }; 

} 

,但我得到以下错误:

Cannot instantiate cyclic dependency! NgControl

有没有人知道我可以workarround它,所以我可以在初始化后访问ngControl?

+0

您正在使用哪个版本? – micronyks

+0

该版本是2.0.0 –

+0

您可以从这里删除提供者部分并将其添加到@NgModel({})中吗? – micronyks

回答

-1

提供商,管道,指令声明从@Compone除去NT@DirectiRC6RC7已经装饰器。所以,你只需要从指令

删除

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

,并将其添加到@NgModule({})装饰

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

}) 
+1

指令中的AFAIK'providers'属性仍然有效。它没有被删除https://github.com/angular/angular/blob/master/modules/%40angular/core/src/metadata/directives.ts#L337 https://angular.io/docs/ts/latest/ cookbook/ngmodule-faq.html#!#q-component-or-module – yurzui

+0

@yurzui感谢分享。那么问题可能不是在这里提供这样的提供者配置。或者可能在这里提供提供商可能创建其他实例或其他东西。 – micronyks

+1

我认为将提供程序注册在NgModule而不是指令中会导致验证程序在可访问CustomValidatorDirective的模块之间共享。当其他指令也使用它时,它会污染NG_VALIDATORS。 –

0

您可以通过喷射阀喷射NgControl避免循环依赖。

constructor(private _injector: Injector) { } 

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