ControlValueAccessor c несколькими formControl в дочернем компоненте
У меня есть несколько formcontrols в дочернем компоненте, как применить валидаторы в дочернем компоненте, так что исходная форма станет недействительной. Было бы идеально реализовать его с помощью ControlValueAccessor, но вы хотите начать с простой группы форм @input.
@Component({
selector: 'my-child',
template: `
<h1>Child</h1>
<div [formGroup]="childForm">
<input formControlName="firstName">
<input formControlName="lastName">
</div>
`
})
export class Child {
@Input()
childForm: FormGroup;
}
2 ответов
Я не знаю, почему вопрос был проголосован, но я чувствую, что это может быть полезно для других, поэтому я публикую ответ. После нескольких попыток привязки детской formgroup мне удалось успешно привязать значение
@Component({
selector: 'my-child',
template: `
<h1>Child</h1>
<div [formGroup]="name">
<input formControlName="firstName">
<input formControlName="lastName">
</div>
`,
providers: [
{provide: NG_VALUE_ACCESSOR, useExisting: Child, multi: true}
]
})
export class Child implements ControlValueAccessor {
name: FormGroup;
constructor(fb: FormBuilder) {
this.name = fb.group({
firstName:[''],
lastName: ['']
});
}
writeValue(value: any) {
if(value) {
this.name.setValue(value);
}
}
registerOnChange(fn: (value: any) => void) {
this.name.valueChanges.subscribe(fn);
}
registerOnTouched() {}
}
сначала это мне очень помогло, но потом я понял, что мы все усложняем. Нам не нужно создавать собственный formControl, мы можем просто передать formGroup нашему дочернему компоненту. В Родительском компоненте вместо
this.form = fb.group({
name:['Angular2 (Release Candidate!)'],
username: [{firstName: 'First', lastName: 'Last'}],
email:['My Email']
});
мы инициализируем username как FormGroup вместо элемента управления:
this.form = fb.group({
name:['Angular2 (Release Candidate!)'],
username: fb.group({
firstName: ['First'],
lastName: ['Last']
}),
email:['My Email']
});
в дочернем компоненте нам нужно свойство ввода для FormGroup
@Input()
usernameGroup: FormGroup;
в дочернем шаблоне:
<div [formGroup]="usernameGroup">
<input formControlName="firstName">
<input formControlName="lastName">
</div>
и затем в Родительском шаблоне:
<my-child [usernameGroup]="form.controls.username"></my-child>
для информации mor, проверьте этот пост: https://scotch.io/tutorials/how-to-build-nested-model-driven-forms-in-angular-2
создание собственного formControl ist действительно перебор здесь, для более inforamtion об этом, посмотрите здесь: http://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html