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

Posted

技术标签:

【中文标题】Angular 2 / 如何防止 IE 触发自动输入验证?【英文标题】:Angular 2 / How to prevent IE from triggering automatically input validation? 【发布时间】:2016-10-29 11:18:50 【问题描述】:

我的 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?

【问题讨论】:

【参考方案1】:

你可以修改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();
    

【讨论】:

【参考方案2】:

只需替换占位符如下: [占位符]="'全名'"

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Angular 2 / 如何防止 IE 触发自动输入验证?的主要内容,如果未能解决你的问题,请参考以下文章

防止 IE11 在 Angular 2 中缓存 GET 调用

IE 10, 11. 如何防止使用占位符的文本输入触发焦点输入事件?

如何防止 Angular 中的多个订阅调用?

防止在 Angular 中多次触发令牌刷新请求

在 Angular Material CDK 拖放中,如何防止项目随着元素移动而自动重新排列?

Angular测试如何防止ngOnInit调用直接测试方法