2017-09-12 41 views
1

我有表单控件是这样的:进样AbstractControlDirective实例作为@ContentChild定制指令

<input formControlName="myName" dynamicDisable> 

然后自定义指令:

@Directive({ 
    selector: '[formControlName][dynamicDisable] 
}) 
export class DynamicDisableDirective implements AfterContentInit { 

     @ContentChild(AbstractControlDirective) control: any; 

     ngAfterContentInit(): void { 
     console.log(this.control); 
     } 
    } 

我想注入指令,所有者元素为@ ContentChild给指令。所有者元素可以是任何类型的表单控件,如简单FormControl,FormGroup甚至FormArray。 FormControlName是AbstractControlDirective的后代。为什么控制台总是记录'undefined'呢?

注:当我切换AbstractControlDirective为NgControl这样的:

@ContentChild(NgControl) control: any; 

一切正常,表单控件实例被注入和记录良好。但是,这种方法只能用于简单的FormControl,而不能用于组和数组。

回答

0

据我所知没有提供任何东西作为AbstractControlDirective,因此查询或注入一个将不会没有进一步的援助工作。

我还没有尝试过,但它可能工作登记别名供应商,如

@Directive({ 
    selector: '[formControlName][dynamicDisable], 
    providers: [ 
    { provide: AbstractControlDirective, useExisting: FormControl, useMulti: true }, 
    { provide: AbstractControlDirective, useExisting: FormGroup, useMulti: true }, 
    ] 
}) 

随着useMulti: true你可以(对所有),获取一个列表,如果有不止一个匹配,然后过滤列表中您实际需要的内容。

+0

如果我提供像这样的AbstractControlDirective,我收到这个错误:'core.es5.js:1020错误错误:未捕获(承诺):错误:没有供应商FormGroup!' – witcher

+0

我明白了。我想你必须使用'useMulti'。 –

+0

其实我不确定这是否可行。该方法来自https://stackoverflow.com/questions/39366869/viewchildren-passing-multiple-components/39366891#39366891。另一种方法是注入或查询它们中的每一个(使用具体类)并检查找到哪一个。 –