我有一个自定义组件在我的应用程序上继承ControlValueAccessor,它集成了ng-select
这个组件的目标是有一个中心位置来集成ng-select,这样我就可以在整个应用程序中重用它。
这就是我调用验证方法的方式:
constructor(
@Optional() @Self() public controlDir: NgControl
) {
controlDir.valueAccessor = this;
}
ngOnInit() {
const control = this.controlDir.control;
if (control.validator) {
control.setValidators([this.validate.bind(this, [control.validator])]);
}
control.updateValueAndValidity({ emitEvent: false });
}
validate(validators: ValidatorFn[], c: FormControl) {
const allErrors: any = {};
for (const validator of validators) {
const hasError = validator(c);
if (hasError) {
Object.entries(hasError).forEach(([errorName, isOnError]) => {
allErrors[errorName] = isOnError;
});
}
}
if (Object.keys(allErrors).length > 0) {
return allErrors;
}
return null;
}
这就是我通常在父组件上实例化formControl的方式:
const control = this.formBuilder.control(['test@gmail.com'], [Validators.email]);
this.form = this.formBuilder.group({ test: control });
我想给父级一个选项,在我的自定义组件上使用内置的角度验证器。(必填项,电子邮件,最小值,最大值……)。
问题是,我的自定义组件的控件值是一个字符串数组,例如,该值将是:
[ 'test@gmail.com', 'jeff@gmail.com' ]
组件如下所示
问题:在我的validate函数中,我可以访问ValidatorFn,它将检查我的控件是否是有效的电子邮件。如果我的控件值是一个字符串,它会像预期的那样工作,但它是一个字符串数组,所以它不工作。
但是我不知道如何确定所定义的验证器是validator.email
。
this.controldir.control.validator
是一个函数,我不知道如何识别它是电子邮件验证器,这样我就可以为电子邮件添加自定义验证了。
问题:我如何从我的自定义验证函数中知道哪个验证器是从父级设置的?是validators.required、validators.email...等等吗
如何从我的自定义验证函数中知道哪个验证器是从父级设置的?
不幸的是,没有办法获得给定控件的验证器(详细信息)。
理论上,您可以迭代您的控件值(如果它是一个数组),并创建一个新的FormControl
来验证数组中的每个字符串。
作为一个例子,您可以这样做:
isControlValid(controlValue: string[], validator: ValidatorFn) {
let emailHasError = false;
for (value of controlValue) {
const ctrl = new FormControl(value, validator);
if (Object.keys(validator(ctrl)).length) {
emailHasError = true; // if any of the values are invalid
}
}
return emailHasError; // or return whatever you need to.
}
也许像这样使用它
validate(validators: ValidatorFn[], c: FormControl) {
const allErrors: any = {};
for (const validator of validators) {
if (Array.isArray(c.value)) {
if (this.isControlValid(c.value, validator)) {
// maybe update `allErrors` here or something
您可以随心所欲地实现它,但这个想法只是使用每个字符串自己的窗体控件来验证它。
使用ng_validators
可能有一些晦涩难懂的方法以不同的方式实现这一点,但我没有研究过它。
问题内容: 我有其他人编写的REST api,其中处理请求到特定url的方法接受一堆从路径参数填充的参数。 撰写此文章的人曾经使用过DropWizard,但我以前没有使用它的经验。我的任务是通过将其与db中的值进行比较来验证studentId字段。这将非常简单,但是我被告知要使用自定义验证程序来执行此操作。我对编写注释非常陌生,但经过大量挖掘后,这样编写了注释, 此后,我将注释添加到了要像这样运行
我正在构建一个Spring Boot应用程序,并试图为我将在服务层验证的一些DTO/实体实现自定义验证。基于Spring关于这个问题的文档,我认为一种方法是实现org。springframework。验证。验证程序界面。 作为一个最小、完整、可重复的示例,请考虑以下代码: Spring初始化引导项目 在src/main/java/com中添加了以下代码。实例使用验证: 如果我点击endpoint触
我有一个表单,它要求两个字段中至少有一个字段具有值才能有效。现在,我已经构建了一个指令“KeywordandAuthor”来处理此验证。我已经成功地让它正确地检查任何一个字段是否有值,如果有,则将验证设置为true。我不确定如何将其他字段的验证设置为true。以下是指令的当前代码: 如何将siblingElem的有效性设置为true? **编辑** 这是我想要的工作解决方案。 要实现的关键点是,n
我试图用Hibernate Validation 6.0.1定义约束定义,其中验证器位于相对于约束注释的不同位置(.jar/项目)。Aka,我有我想要验证的对象,它们位于带有注释定义的项目“api”中,但我将在项目“modules/common”中有验证器 我遵循文档中的描述。 配置文件 约束注释 验证器 我的问题我的问题是,如果我没有将“@约束(validatedby={})”放在注释中,我会得
问题内容: 我正在使用带有自定义验证的Angular2的FormBuilder开发表单。问题:在customValidator中,我用来访问本地对象。执行验证时出现错误。 看起来customValidator是在其他对象中执行的,因此更改了引用 问题: 如何传递对customValidator 的引用? 问题答案: 使用箭头函数,以确保该函数绑定到此:
我有一个名为的自定义验证器函数。 如果我像这样设置表单,一切都工作了: 但是,如果我使用这样的表单生成器设置表单: 如果构造函数中将定义为,则验证不起作用。所谓“不工作”,我的意思是表单的valid属性不正确,在控制台中我看不到预期的输出(使用第一个方法显示)。 我没有在第二个方法中正确定义验证器(如果是这样的话,应该如何定义它),或者FormBuilder有什么东西使自定义验证器不可用?