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

jpm*_*jpm 10 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>
Run Code Online (Sandbox Code Playgroud)

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

我为AngularJS找到了解决这个问题的方法.请参阅AngularJS /如何防止IE触发自动输入验证?

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

小智 0

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

可能的解决方案:

<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>
Run Code Online (Sandbox Code Playgroud)

指令代码:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)