【发布时间】:2018-12-16 09:51:00
【问题描述】:
如何在 FormBuilder 中对此组件运行自定义验证?
例如,当用户从onClickItem(item)下拉列表中选择一个项目时
如何从主表单组件中对选定的item 运行验证函数?
主表单组件中的FormBuilder:
this.itemForm = this.fb.group({
name: ['', [Validators.required, Validators.minLength(3)]],
description: ['', [Validators.required, Validators.minLength(10)]],
itemName: [] // run validation on this component
});
然后我可以像这样在 itemName 上使用验证器:itemName: [, MyValidator.itemNotUsed],
模板:
<app-dropdown-select formControlName="itemName"
[dropdownItems]="items">
</app-dropdown-select>
下拉选择组件:
@Component({
selector: 'app-dropdown-select',
templateUrl: './dropdown-select.component.html',
styleUrls: ['./dropdown-select.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DropdownSelectComponent),
multi: true
}
]
})
export class DropdownSelectComponent implements ControlValueAccessor {
@Input() combinedInput: boolean;
@Input() dropdownItems: DropdownItem[];
_selectedItem: DropdownItem;
showList: boolean;
buttonIcon: string;
propagateChange = (_: any) => {};
set selectedItem(value) {
this._selectedItem = value;
this.propagateChange(this._selectedItem);
}
get selectedItem() {
return this._selectedItem;
}
constructor(private el: ElementRef) { }
OnInit() {
this.buttonIcon = BUTTON_ICON_INACTIVE;
this.selectedItem = this.dropdownItems[0];
console.log(this.dropdownItems);
}
onClick() {
this.toggleShowList();
}
toggleShowList() {
this.showList = !this.showList;
if (!this.showList) {
this.buttonIcon = BUTTON_ICON_INACTIVE;
} else {
this.buttonIcon = BUTTON_ICON_ACTIVE;
}
}
onClickItem(item) {
this.showList = false;
this.selectedItem = item;
this.propagateChange(this.selectedItem);
}
writeValue(value: any) {
if (value !== undefined) {
this.selectedItem = value;
}
}
registerOnChange(fn) {
console.log('register change');
this.propagateChange = fn;
}
registerOnTouched() {}
}
【问题讨论】:
-
您可以将 FormControl 传递给组件,这将使您的生活更轻松。 (要传递 FormControl,您需要一个 Input() 并制作类似
[control]="formGroup.get('input')"的内容 -
我宁愿在组件之外定义验证器,然后将它应用到formbuilder中的控件,它认为这样更易于维护
标签: angular