Angular 如何在模板驱动窗体中创建自定义控件以正确渲染?

Angular 如何在模板驱动窗体中创建自定义控件以正确渲染?,angular,validation,Angular,Validation,问题是:要么我可以使用绑定的ngModel的自定义控件渲染值,要么我可以按照预期使用验证“冒泡” 我的自定义文本组件有一个在该层上受尊重的必需属性,但父级不知道它,除非我使用viewProvider。但是,在使用viewProvider时,我没有任何渲染功能 我创建了一个stackblitz,用一个运行的例子来说明我的意思。 请找到自定义文本组件并尝试使用viewProvider已注释和未注释的表单 我很想了解我做错了什么,以及如何在表单和自定义控件之间实现这种通信。从添加提供:NG_VALI

问题是:要么我可以使用绑定的
ngModel
的自定义控件渲染值,要么我可以按照预期使用验证“冒泡”

我的自定义文本组件有一个在该层上受尊重的必需属性,但父级不知道它,除非我使用viewProvider。但是,在使用viewProvider时,我没有任何渲染功能

我创建了一个stackblitz,用一个运行的例子来说明我的意思。 请找到
自定义文本组件
并尝试使用viewProvider已注释和未注释的表单

我很想了解我做错了什么,以及如何在表单和自定义控件之间实现这种通信。

从添加提供:NG_VALIDATORS中,删除必需的并添加一个validatiton函数,如

public setDisabledState?(isDisabled: boolean): void { }
validate(control:any){
    return this.model?null:{required:true}
  }

更新 当我们将字符串数组(或数字数组)与[(ngModel)]一起使用时,会出现问题

这不管用

  {{model.loopValues|json}}
  //NOT WORK
  <div *ngFor="let n of model.loopValues; let i = index;">
    <input [(ngModel)]="n" 
        name="{{'ct'+i}}" #control="ngModel"></custom-text>
  </div>
现在我们可以做了

<div *ngFor="let n of array; let i = index;">
    <custom-text [(ngModel)]="model.loopValues[i]" 
      name="{{'ct'+i}}" #control="ngModel"></custom-text>
</div>

奖励:我们可以用a写一些类似的东西

<div *repeat="model.loopValues.length;let i">
    <custom-text [(ngModel)]="model.loopValues[i]" 
      name="{{'ct'+i}}" #control="ngModel"></custom-text>
</div>


谢谢你的提示!我将检查validate方法,看看它在我的实际代码库中是否有效。我的场景比这个stackblitz示例要复杂一些:)并且有基于您建议的示例:)我认为这会很好,谢谢您指出这一点!不要使用正常的输入。(很抱歉,现在已经晚了,如果我有时间,我会试着知道为什么会发生)我很感激:)我不断地用Angular进入这些奇怪的场景,最后经过了数小时的研究和反复试验。我更新了我的答案,试图解释为什么ngModel和字符串数组会导致问题。注意:这不是官方的,这只是我个人的观点,我尝试过不使用
viewProviders:[{provide:ControlContainer,useExisting:NgForm}],
的解决方案,但是没有这个,我看不到自定义表单组件的任何通信。它的ngModel是未定义的。
<div *ngFor="let n of array; let i = index;">
    <custom-text [(ngModel)]="model.loopValues[i]" 
      name="{{'ct'+i}}" #control="ngModel"></custom-text>
</div>
<div *repeat="model.loopValues.length;let i">
    <custom-text [(ngModel)]="model.loopValues[i]" 
      name="{{'ct'+i}}" #control="ngModel"></custom-text>
</div>