Angular 自定义指令不适用于输入模式
Angular custom directive not working on input pattern
我正在尝试使用自定义 Angular 指令设置正则表达式模式:
import { Directive, ElementRef } from '@angular/core';
@Directive({
selector: '[appPasswordRegex]',
})
export class PasswordRegexDirective {
constructor(private el: ElementRef) {
this.el.nativeElement.pattern = '^(?=.*?[a-zA-Z])(?=.*?[0-9]).*$';
}
}
HTML:
<input
appPasswordRegex
type="password"
ngModel
name="password"
required
minlength="7"
/>
我还在控制台中检查了 this.el
并且模式 属性 已成功更改,但未实际应用。与此相反,如果我只是像下面这样在输入中写入模式,它会完美地工作,即使模式 属性 在两种情况下都被更改:
<input
type="password"
ngModel
name="password"
required
pattern="^(?=.*?[a-zA-Z])(?=.*?[0-9]).*$"
minlength="7"
/>
可能是什么问题?
当您将 pattern
直接添加到具有 ngModel
的输入时,您不仅仅是在设置属性。在 FormsModule
中有一个 PatternValidator 指令与该选择器匹配,并围绕提供给 ngModel 的 FormControl 的模式添加验证。
要使用您的指令实现类似的行为,您必须创建自定义验证器指令。 Here 你可以找到关于如何创建它们的官方文档。
例如,您可以这样做:
@Directive({
selector: '[appPasswordRegex]',
providers: [
{
provide: NG_VALIDATORS,
useExisting: PasswordRegexDirective,
multi: true,
},
],
})
export class PasswordRegexDirective implements Validator {
validate(control: AbstractControl): ValidationErrors {
return /^(?=.*?[a-zA-Z])(?=.*?[0-9]).*$/.test(control.value)
? null
: { invalidPassword: true };
}
}
干杯
我正在尝试使用自定义 Angular 指令设置正则表达式模式:
import { Directive, ElementRef } from '@angular/core';
@Directive({
selector: '[appPasswordRegex]',
})
export class PasswordRegexDirective {
constructor(private el: ElementRef) {
this.el.nativeElement.pattern = '^(?=.*?[a-zA-Z])(?=.*?[0-9]).*$';
}
}
HTML:
<input
appPasswordRegex
type="password"
ngModel
name="password"
required
minlength="7"
/>
我还在控制台中检查了 this.el
并且模式 属性 已成功更改,但未实际应用。与此相反,如果我只是像下面这样在输入中写入模式,它会完美地工作,即使模式 属性 在两种情况下都被更改:
<input
type="password"
ngModel
name="password"
required
pattern="^(?=.*?[a-zA-Z])(?=.*?[0-9]).*$"
minlength="7"
/>
可能是什么问题?
当您将 pattern
直接添加到具有 ngModel
的输入时,您不仅仅是在设置属性。在 FormsModule
中有一个 PatternValidator 指令与该选择器匹配,并围绕提供给 ngModel 的 FormControl 的模式添加验证。
要使用您的指令实现类似的行为,您必须创建自定义验证器指令。 Here 你可以找到关于如何创建它们的官方文档。
例如,您可以这样做:
@Directive({
selector: '[appPasswordRegex]',
providers: [
{
provide: NG_VALIDATORS,
useExisting: PasswordRegexDirective,
multi: true,
},
],
})
export class PasswordRegexDirective implements Validator {
validate(control: AbstractControl): ValidationErrors {
return /^(?=.*?[a-zA-Z])(?=.*?[0-9]).*$/.test(control.value)
? null
: { invalidPassword: true };
}
}
干杯