提问人:Niko 提问时间:8/26/2021 最后编辑:Niko 更新时间:8/27/2021 访问量:712
仅在输入验证成功后更新 ngModel
Update ngModel only after successful input validation
问:
我定义了以下输入
<input
id="xInputControl"
name="xInputControl"
type="text"
xInput
class="form-control"
[(ngModel)]="x"
#validated="ngModel"
(ngModelChange)="valueChanged()"
/>
和以下自定义验证程序
@Directive({
selector: '[xInput]',
providers: [
{
provide: NG_VALIDATORS,
useExisting: LatestXInputValidatorDirective,
multi: true,
},
],
})
export class LatestXInputValidatorDirective implements Validator {
validate(control: AbstractControl): ValidationErrors | null {
if (
control.value === undefined ||
control.value === null ||
control.value === ''
) {
return { emptyInput: 'dummy text' };
} else if (
control.value.indexOf(',') > 0 ||
control.value.indexOf('.') > 0
) {
return { decimalNumber: control.value };
} else {
const parsed = parseInt(control.value);
if (isNaN(parsed)) return { notANumber: control.value };
else if (parsed > 200) return { overLimits: control.value };
else if (parsed < 1) return { negativeNumber: control.value };
else if (parsed === 1) return { useLatestAggregation: control.value };
// this the case where the result is valid
else return null;
}
}
}
基于此文档
除非 ngModel 的值通过输入字段的验证,否则不会设置该值。例如:email 类型的输入必须具有 user@domain 形式的值
也在这里
ngModel 中的默认行为是,当验证确定模型值无效时,模型值设置为 undefined。
因此,我希望仅在输入通过验证时调用html输入中定义的方法。ngModelChange
不幸的是,事实并非如此。每次我键入内容时都会被调用。我知道这一点,因为这是方法(ngModelChange)="valueChanged()
valueChanged() {
console.warn('x is ', this.x);
...
}
每次击键时,我都会在控制台上看到日志
如何仅在输入具有 VALID 值时才调用 get - 通过验证?valueChanged
LatestXInputValidatorDirective
答:
0赞
Sameh
8/27/2021
#1
在这种情况下,我建议不要使用双重绑定方法。如果具有使用 [()] 语法(也称为“banana-box 语法”)的双向绑定,则 UI 中的值始终会同步回类中的域模型。
[(ngModel)]="x"
你的 html 应该看起来更像这样
<form #it="ngForm" (ngSubmit)="submit(it, $event)>
<input
type="text"
id="xInputControl"
name="xInputControl"
class="form-control"
ngModel
#xInputControl="ngModel"
xInput/>
<button type="submit" [disabled]="!it.valid">
submit
</button>
</form>
评论
0赞
Niko
8/27/2021
不过,我没有创建表单的选项。它应该只是一个输入。
0赞
Sameh
8/28/2021
这只是一种演示验证的方法,但您的主要问题是您正在使用双重绑定 [()],这将始终从 UI 更新您的模型
评论