gpt4 book ai didi

javascript - Angular 2 使用指令防止输入和模型更改

转载 作者:行者123 更新时间:2023-11-28 06:06:52 26 4
gpt4 key购买 nike

我需要验证一个字段仅包含某个范围内的数字。所以我尝试写一个指令:

@Directive({
selector: "[input-limitation]",
host: {
'(input)': 'onChange($event)',
}
})
export class InputLimitationDirective {
@Input("input-limitation") settings: InputLimitationSettings;

public constructor(private el: ElementRef) {
let self = this;
console.log(":::::::::::::::: el.nativeElement", el.nativeElement);
//jQuery(el.nativeElement).on('keypress', function (e) { self.onChange(e) });
};

private onChange($event) {

console.log("InputLimitationDirective", this.settings);

if (this.settings.InputType = "number") {
return this.numberLimitation($event);
}
}

private numberLimitation($event: any) {
let val: number = $event.target.value;
console.log("InputLimitationDirective", val);
console.log(val, this.settings.MinValue);
console.log(!val, val*1 < this.settings.MinValue*1);

if (!val || val*1 <= this.settings.MinValue*1) {
console.log("1 case");
event.preventDefault();
event.stopPropagation();
return false;
}
else if (val*1 >= this.settings.MaxValue*1) {
console.log("2 case");
event.preventDefault();
event.stopPropagation();
return false;
};

return true;
}
}

并以这种方式使用:

<input (change)="totalAmountChanged($event.target.value)"
[(ngModel)]="model.UsedVolume"
[disabled]="!isEditMode"
type="number"
[input-limitation]="usedVolumeInputLimitationsSettings"
pattern="^[1-9]\d*$" min="1" max="999" maxlength="3"
class="form-control length-3-input" />

但这是一个大问题:1.此限制在 Angular 2 模型更改后触发,因此我将在模型中获得 0 值(但我需要 1 作为最小值)。2. 这只是更改输入值,而不更改 Angular 2 模型值。

那么,是否可以在 Angular 模型更改之前验证并阻止某些输入?

最佳答案

我应该使用自定义值访问器来实现这一点。这是一个示例:

const CUSTOM_VALUE_ACCESSOR = new Provider(
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => MaxValueAccessor), multi: true});

@Directive ({
selector: 'input[max]',
host: { '(input)': 'doOnChange($event.target)' },
providers: [ CUSTOM_VALUE_ACCESSOR ]
})
export class MaxValueAccessor extends DefaultValueAccessor {
onChange = (_) => {};
onTouched = () => {};

writeValue(value:any):void {
if (value!=null) {
super.writeValue(value);
}
}

doOnChange(elt) {
var val = elt.value;
// check value here
elt.value = val;
this.onChange(val);
}
}

这样您就可以插入 ngModel 处理中。

有关更多详细信息,请参阅此问题:

关于javascript - Angular 2 使用指令防止输入和模型更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36770846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com