Man*_*nny 21 validation formbuilder angular
我有一个表格,我正在收集电话号码(手机,个人,其他).我需要至少填充输入.我正在尝试使用Angular2 FormBuilder.
经过大量研究后,我遇到了解决这个问题的问题.我知道我可以使用其他方法来做到这一点,但我想知道是否可以使用FormBuilder验证器.如果我添加"Validators.required",那么所有3个字段都是必需的.有什么建议或想法吗?
phone: this._fb.group(
{
other: [''],
personal: [''],
mobile: [''],
}
Run Code Online (Sandbox Code Playgroud)
根据"JB Nizet"的提示,这是我必须实现的工作:
我的组Validator(它仍然需要调整):
static phoneExists(group: FormGroup): { [key: string]: any } {
if (null != group) {
var other: AbstractControl = group.controls['other'];
var mobile: AbstractControl = group.controls['mobile'];
var personal: AbstractControl = group.controls['personal'];
var data: Object = group.value;
return (
(other.valid && isEmptyInputValue(other.value))
&& (mobile.valid && isEmptyInputValue(mobile.value))
&& (personal.valid && isEmptyInputValue(personal.value))
)
? { 'required': true }
: null;
}
}
Run Code Online (Sandbox Code Playgroud)
我的小组改变了:
phone: this._fb.group(
{
other: [''],
personal: [''],
mobile: [''],
},
{ validator: MyValidators.phoneExists }
)
Run Code Online (Sandbox Code Playgroud)
我花了一段时间,但关键是要添加关键词"验证器",它将导致组验证器触发.
在HTML中我添加了以下内容:
<small *ngIf="!myForm.controls.profile.controls.phone.valid" class="text-danger">
At least one phone is required.
</small>
Run Code Online (Sandbox Code Playgroud)
我希望这有助于其他任何人.
Mer*_*ott 27
我使用一个atLeastOne函数,根据任何现有的验证器创建自定义验证器:
import { FormGroup, ValidationErrors, ValidatorFn } from '@angular/forms';
export const atLeastOne = (validator: ValidatorFn) => (
group: FormGroup,
): ValidationErrors | null => {
const hasAtLeastOne =
group &&
group.controls &&
Object.keys(group.controls).some(k => !validator(group.controls[k]));
return hasAtLeastOne ? null : { atLeastOne: true };
};
Run Code Online (Sandbox Code Playgroud)
美丽的是你可以使用任何验证器,而不仅仅是Validators.required.
在OP的情况下,它将像这样使用:
{
phone: this._fb.group({
other: [''],
personal: [''],
mobile: [''],
}, { validator: atLeastOne(Validators.required) })
}
Run Code Online (Sandbox Code Playgroud)
这是一个可以与每个FormGroup一起使用的通用代码:
export function AtLeastOneFieldValidator(group: FormGroup): {[key: string]: any} {
let isAtLeastOne = false;
if (group && group.controls) {
for (const control in group.controls) {
if (group.controls.hasOwnProperty(control) && group.controls[control].valid && group.controls[control].value) {
isAtLeastOne = true;
break;
}
}
}
return isAtLeastOne ? null : { 'required': true };
}
Run Code Online (Sandbox Code Playgroud)
用法:
@Component({
selector: 'app-customers',
templateUrl: './customers.component.html',
styleUrls: ['./customers.component.scss']
})
export class CustomersComponent implements OnInit {
public searchCustomerForm: FormGroup;
constructor() { }
ngOnInit() {
this.searchCustomerForm = new FormGroup({
customerID: new FormControl(''),
customerEmail: new FormControl(''),
customerFirstName: new FormControl(''),
customerLastName: new FormControl('')
}, AtLeastOneFieldValidator);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10296 次 |
| 最近记录: |