Angular 2 /如何防止IE触发自动输入验证?

时间:2016-06-27 12:28:25

标签: internet-explorer angular

我的Angular 2应用程序中有使用ngControl的表单。例如:

<label for="login-field-inputLogin" class="sr-only">Login</label>
<input 
    [(ngModel)]="login" 
    id="login-field-inputLogin" 
    class="form-control" 
    placeholder="Login" 
    ngControl="loginCtrl" 
    #loginCtrl="ngForm" 
    type="text" 
    required />
<div [hidden]="loginCtrl.valid || loginCtrl.pristine" class="alert alert-danger">Login is required</div>

不幸的是,在IE 11上,当有一个占位符时,只要该字段获得焦点,就会显示消息“需要登录”。

我为AngularJS找到了解决这个问题的方法。见AngularJS / How to prevent IE triggering automatically inputs validation?

如何让这个解决方案适应Angular 2?

3 个答案:

答案 0 :(得分:0)

您可以修改this方法来解决此问题。

可能的解决方案:

<label for="login-field-inputLogin" class="sr-only">Login</label>
<input 
    validate-onblur     <---    directive, see below
    [(ngModel)]="login"
    id="login-field-inputLogin"
    class="form-control"
    placeholder="Login"
    ngControl="loginCtrl"
    #loginCtrl="ngModel"
    type="text"
    required />
<div [hidden]="loginCtrl.valid || loginCtrl.pristine" class="alert alert-
danger">Login is required</div>

指令代码:

@Directive({
    selector: '[validate-onblur]',
    host: {
        '(focus)': 'onFocus($event)',
        '(blur)' : 'onBlur($event)'
    }
})
export class ValidateOnBlurDirective {

    private hasFocus = false;

    constructor(public formControl: NgControl) {
    }

    // mark control pristine on focus
    onFocus($event) {
        this.hasFocus = true;
        this.formControl.control.valueChanges
            .filter(() => this.hasFocus)
            .subscribe(() => {
                this.formControl.control.markAsPristine();
            });
    }

    // mark control  dirty on focus lost
    onBlur($event) {
        this.hasFocus = false;
        this.formControl.control.markAsDirty();
    }
}

答案 1 :(得分:0)

使用[placeholder]代替占位符正在工作。但是,如果您使用的是i18n工具,则会遇到下一个问题,该占位符文本将不再从提取工具中解析,并且占位符的翻译将不再起作用:D

答案 2 :(得分:-1)

只需按以下方式替换占位符: [placeholder] =“'全名'”