Я не знаю ни одного встроенного способа сделать это, но вот один из подходов, который будет использовать пользовательский метод доступа к значениям .
custom-input.component.ts
@Component({
selector: 'app-custom-input',
template: `
<p>
custom input:
<input
#i
(input)="onChangeFn($event.target.value)"
(blur)="onTouchedFn()"
type="text"
[formControl]="input"
>
</p>
<p>
inner input value: {{ i.value }}
</p>
`,
providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: CustomInputComponent, multi: true, } ]
})
export class CustomInputComponent implements OnInit, ControlValueAccessor {
input: FormControl;
onTouchedFn: Function;
onChangeFn: Function;
constructor(private fb: FormBuilder) { }
ngOnInit() {
this.input = this.fb.control('');
}
registerOnChange (fn) {
this.onChangeFn = fn;
}
registerOnTouched (fn) {
this.onTouchedFn = fn;
}
writeValue (v) { this.input.setValue(v); }
}
parent.component.ts
specialInput = new FormControl('', { updateOn: 'blur', validators: Validators.required });
parent.component. html
<app-custom-input [formControl]="specialInput"></app-custom-input>
<p>
Special input validation status: {{ specialInput.valid || 'false' }}
</p>
Вы можете думать о своих элементах управления формой как о tree структура:
FG - FormGroup; FC - FormControl
FG
/ | \
FC FC FC
В вашем случае, когда FC
изменил свое значение (например, из-за ввода пользователя), все его потомки (в данном случае FG
, но в сложный пример, их может быть и больше), а также придется обновлять независимо от их значения updateOn
.
Следуя этому подходу, это дерево теперь будет выглядеть так (при условии, что последний FC
построен следующим образом):
FG
/ | \_________
FC FC | FC |
| \ |
| FC <-- the `input` elem. in the custom component
|_________|
В результате значение будет обновляться onChange
во внутреннем FC
и onBlur
в external FC
.
StackBlitz .
Кроме того, если вы хотите узнать больше о формах, я рекомендую проверить эта статья .