gpt4 book ai didi

javascript - 模型驱动的表单 - IE11 上的输入占位符问题

转载 作者:太空狗 更新时间:2023-10-29 17:59:08 26 4
gpt4 key购买 nike

我已将我的应用程序从 Angular 2.x 更新到 Angular 4.0.0。从这时候开始,输入类型文本表单控件出现以下问题:


在 IE11 上,当接收到焦点时,占位符被移除,表单控件被设置为 dirty,pristine 被设置为 false。在 Chrome/FF 上,这个问题永远不会发生。

在 IE11 上,输入元素一旦获得焦点就会变脏。例如,与 Chrome 不同,您必须先输入。

HTML:

<input 
type="text"
class="form-control"
id="processName"
[(ngModel)]="process.displayName"
[disabled]="isProcessLoading"
#processName="ngModel"
maxLength="64"
pattern="^.*\S.*"
name="processName"
placeholder="{{'PROCESS-FORM.name-placeholder' | translate}}"
required
placeholderRequired
[inputBinding]="processName"
/>

我创建了一个指令,当它处于焦点状态时,将所有错误设置为 null(有效)。

@Directive({
selector: '[placeholderRequired]'
})
export class PlaceHolderDirective {
@Input() inputBinding: any = null;

constructor(private elementRef: ElementRef) {
}

@HostListener('focus', ['$event'])
handleFocus(event: any) {
if (navigator.appVersion && navigator.appVersion.indexOf('.NET') > -1) {
// IE only
if (!this.inputBinding._control._value) {
this.inputBinding.control.setErrors(null);
setTimeout(() => this.inputBinding.control.setErrors(null),0);
}
}
}

@HostListener('mousedown', ['$event'])
handleMouseDown(event: any) {
if (navigator.appVersion && navigator.appVersion.indexOf('.NET') > -1) {

if (!this.inputBinding._control._value) {
this.inputBinding.control.setErrors(null);
setTimeout(() => this.inputBinding.control.setErrors(null),0);
}
}
}

@HostListener('blur', ['$event'])
handleBlur(event: any) {
if (navigator.appVersion && navigator.appVersion.indexOf('.NET') > -1) {
if (!this.inputBinding._control._value.trim()) {
// handle blur event
}
}
}
}

When user clicks on input field, somewhere from angular's valueAccessor.onValueChanges(), that field is marked as dirty, using control.markAsDirty().

I have added setTimeout() as well, but it gets executed after markAsDirty() is executed which causes little fluctuation in UI (dirty true -> dirty false).

是否可以通过任何其他方法解决此行为?有什么方法可以覆盖 onValueChanges() 因为它在内部将字段设置为脏。不需要添加其他库(如 placeholder.js)。

最佳答案

我定制的pristine如下:

ts 文件

iePristine: boolean = true;
pincodeCtrl = <formControl>this.form.get('pincode')
setPlaceholder() {
const placeholder = 'Enter Code';
if (this.pincodeCtrl.value) {
this.iePristine = false;
}
if (this.iePristine) {
this.pincodeCtrl.markAsPristine();
}
return placeholder;
}

isInvalidControl(control: FormControl) {
return control.invalid && (control.dirty || control.touched);
}

html文件

<input type="text" [placeholder]="setPlaceholder()" formControlName="pincode"
[ngClass]="isInvalidControl(pincodeCtrl) ? 'form-control text-center is-invalid' : 'form-control text-center'" />

关于javascript - 模型驱动的表单 - IE11 上的输入占位符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44433804/

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