use*_*798 6 tags validation angular ngx-chips angular7
我正在使用ngx-chips将电子邮件列表作为标签添加到输入中。验证器确保每个标签看起来像一封电子邮件。
我如何确保:
1)验证器仅在添加标签时触发(即,用户点击回车,空格或逗号)
2)如果在按回车/空格/逗号时电子邮件无效,则该值仍然存在(即,它不会清除...以便用户可以对其进行修复)
堆栈闪电战在这里:https ://stackblitz.com/edit/ngx-chips-example-2qdudc
以下是我的电子邮件验证程序:
public validators = [ this.must_be_email ];
public errorMessages = {
'must_be_email': 'Please be sure to use a valid email format'
};
private must_be_email(control: FormControl) {
var EMAIL_REGEXP = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,3}$/i;
if (control.value.length != "" && !EMAIL_REGEXP.test(control.value)) {
return { "must_be_email": true };
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
以下是标签:
<tag-input [(ngModel)]='emails'
name="emails"
#email="ngModel"
[errorMessages]="errorMessages"
[validators]="validators"
[editable]='true'
(onTagEdited)="onTagEdited($event)"
[separatorKeyCodes]="[32,188,186,13,9]"
[placeholder]="'Add email'"
[secondaryPlaceholder]="'Enter email address(es)'"
[clearOnBlur]="true"
[addOnPaste]="true"
[addOnBlur]="true"
[pasteSplitPattern]="splitPattern"
theme='bootstrap'
required >
</tag-input>
Run Code Online (Sandbox Code Playgroud)
对于2),我尝试在验证器中将“ return null”更改为control.value ...但是没有用
最终,这种控制的笨拙实现使事情变得困难。如果它是一个 ControlValueAccessor,其模型包含当前输入和标签数组,那么找到解决方案会简单得多。
与@AlesD 的回答一样,我采用了一个使用onAdding. 他提出的一个问题是使用this. 为了解决这个问题,我bind()在必要时使用该函数。
为了实现您想要的行为,我做了三件事:
onAdding. 它验证标签,如果验证失败,则将addFirstAttemptFailed设置为 true 并返回可观察的错误(我升级到 rxjs 6)。抛出此错误会阻止添加标签。不幸的是,在 onAdding 期间调用的方法有一些绑定。
setInputValue(),传递已经设置的值。相信我,在偶然发现这种副作用之前,我尝试了上千种变体。尝试调用组件updateValueAndValidty()上的 FormControl 实例或 TagInputComponent 中的 Form 和 FormControl 的各种实例从来没有完全奏效。throwError(). 不幸的是,订阅在内部设置的方式是 TagInput 组件只调用catchError()它的订阅回调函数,而不是源 observable。所以错误会显示在控制台中。再次 - 我尝试了很多不同的方法来解决它。@ViewChild('tagInput')
tagInput: SourceTagInput;
public validators = [ this.must_be_email.bind(this) ];
public errorMessages = {
'must_be_email': 'Please be sure to use a valid email format'
};
public readonly onAddedFunc = this.beforeAdd.bind(this);
private addFirstAttemptFailed = false;
private must_be_email(control: FormControl) {
if (this.addFirstAttemptFailed && !this.validateEmail(control.value)) {
return { "must_be_email": true };
}
return null;
}
private beforeAdd(tag: string) {
if (!this.validateEmail(tag)) {
if (!this.addFirstAttemptFailed) {
this.addFirstAttemptFailed = true;
this.tagInput.setInputValue(tag);
}
return throwError(this.errorMessages['must_be_email']);
}
this.addFirstAttemptFailed = false;
return of(tag);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1103 次 |
| 最近记录: |