首页 文章

将AbstractControlDirective实例作为@ContentChild注入自定义指令

提问于
浏览
1

我有这样的表单控件:

<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'呢?

注意:当我像这样切换NgControl的AbstractControlDirective时:

@ContentChild(NgControl) control: any;

一切都按预期工作,表单控件实例被注入并记录良好 . 但是,此方法只能用于简单的FormControl,而不能用于组和数组 .

1 回答

  • 0

    据我所知,没有提供 AbstractControlDirective ,因此如果没有进一步的帮助,查询或注入一个将无法工作 .

    我没有尝试,但它可能会工作注册别名提供商,如

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

    使用 useMulti: true ,你可以(对所有人)获得一个列表,如果有多个匹配,然后过滤列表中你真正想要的 .

相关问题