问题:要么可以让自定义控件呈现绑定的ngModel
的值,要么可以像预期的那样使验证“冒泡”。
我的自定义文本组件具有必需的属性,该属性在该层上得到尊重,但是除非我使用viewProvider,否则父级不知道该属性。但是,当使用viewProvider时,我没有任何渲染。
我用我的意思的例子创建了一个闪电战。
请找到custom-text
组件,并尝试在viewProvider注释和未注释的表单。
https://stackblitz.com/edit/angular-fail-to-render
我很想了解我在做什么,以及如何实现表单和自定义控件之间的通信。
答案 0 :(得分:1)
从this response中添加要提供的内容:NG_VALIDATORS,删除必需项并添加有效的函数,如
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>
并且不起作用,因为ngModel绑定在时间变量“ n”上。如果model.loopValues是对象的数组,则此工作是因为绑定在对象的“内存位置”上。
我们可以考虑一下
//NOT WORK
<div *ngFor="let n of model.loopValues; let i = index;">
<input [(ngModel)]="model.loopValues[i]"
name="{{'ct'+i}}" #control="ngModel"></custom-text>
</div>
不起作用,因为当我们更改输入时,由于Angular再次渲染* ngFor
而失去了焦点我的想法在.ts中,具有与模型相同长度的数组。loopValues
array=new Array(this.model.loopValues.length)
现在我们可以做
<div *ngFor="let n of array; let i = index;">
<custom-text [(ngModel)]="model.loopValues[i]"
name="{{'ct'+i}}" #control="ngModel"></custom-text>
</div>
奖金:我们可以使用repeat directive并写类似的内容
<div *repeat="model.loopValues.length;let i">
<custom-text [(ngModel)]="model.loopValues[i]"
name="{{'ct'+i}}" #control="ngModel"></custom-text>
</div>