2017-09-12 40 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。另一種方法是注入或查詢它們中的每一個(使用具體類)並檢查找到哪一個。 –