【问题标题】:Angular2 Forms Validation Error messagesAngular2 表单验证错误消息
【发布时间】:2017-05-12 23:34:13
【问题描述】:

我是 Angular 和 JavaScript 的新手,我正在尝试使用 Materialize 库(data-error 属性)在用户输入错误时添加消息。所以我的 html 组件看起来像这样:

            <input
                    type="text"
                    id="username"
                    formControlName="username"
                    [class.valid]="username?.valid && username.dirty"
                    [class.invalid]="!username?.valid && username.dirty && !username.pending"
            >
            <label for="username"
                   data-error="ERROR_MESSAGE" // <-- this is what I need to work
            >Username</label>

我想根据存在的错误更改数据错误属性。现在它会在出现任何错误时打印“ERROR_MESSAGE”。我尝试编写一个函数并将其与 [attr.data-error] 绑定,如下所示:

    displayUsernameErrorMessage() {
    let message = '';
    let usernameError = this.username.errors;
    if(usernameError.pattern){
        message = "Invalid Username"
        console.log(usernameError);
    }
    else {
        return null;
    }
}

我认为我在这方面做得非常糟糕,该功能在控制台中记录了 10 次,这是一个糟糕的解决方案。非常感谢有关如何使其更好地工作的任何想法!

编辑 1: 附加信息是我想根据错误显示不同的消息。因此,如果我从 Validator.pattern 收到错误消息 - 我希望消息类似于“无效的用户名”,或者如果它来自 Validators.required -“请插入用户名”,类似的内容。

【问题讨论】:

    标签: forms validation angular messages materialize


    【解决方案1】:

    我也需要做这样的事情,所以我最终编写了一个可以放置在&lt;label&gt; 元素上的指令。

    在您的示例中,它看起来像这样:

    <label for="username" errorMessageForFormControl>Username</label>
    <input required id="username" formControlName="username">
    

    我想避免重复控件名称两次,因此指令查看for 属性的值并从中找到控件。如果您的 FormControls 和 &lt;input&gt; 字段 ID 碰巧不匹配,您可以自己设置。

    <label for="somethingDifferent" errorMessageForFormControl="username">Username</label>
    <input required id="somethingDifferent" formControlName="username">
    

    指令最终看起来像这样:

    import { Directive, Host, HostBinding, Input, Optional, OnInit, SkipSelf } from '@angular/core';
    import { AbstractControl, ControlContainer } from '@angular/forms';
    
    @Directive({
        selector: '[errorMessageForFormControl]'
    })
    export class errorMessageDirective implements OnInit {
        @HostBinding('class.validation-error') validationErrorCssClass = false;
        @HostBinding('attr.data-error') errorMessage: string = null;
    
        @Input() public errorMessageForFormControl: string;
        @Input() public for: string;
    
        private ctrl: AbstractControl = null;
    
        constructor(
            @Optional() @Host() @SkipSelf()
            private controlContainer: ControlContainer
        ) { }
    
        public ngOnInit(): void {
            if (!this.controlContainer) {
                return;
            }
    
            const formControlName = this.errorMessageForFormControl || this.for;
            if (formControlName) {
                this.ctrl = this.controlContainer.control.get(formControlName);
            }
    
            if (this.ctrl) {
                this.ctrl.statusChanges.subscribe(statusText => {
    
                    if (statusText === 'INVALID') {
                        // invalid
                        const errors = this.ctrl.errors;
                        if (errors) {
                            const errKey = Object.keys(errors)[0];
                            const errVal = errors[errKey];
                            this.errorMessage = errVal === true ? errKey : errVal;
                        } else {
                            this.errorMessage = 'validation failed';
                        }
    
                        this.validationErrorCssClass = true;
                    } else {
                        // valid
                        this.errorMessage = null;
                        this.validationErrorCssClass = false;
                    }
                });
            }
        }
    }
    

    并且可以参考一些css中的data-error属性

    [data-error].validation-error::after {
        color:red;
        content: attr(data-error);
        opacity: 0.8; 
        font-weight: bold;
        font-style: italic;
        font-size: 0.75em;
        margin-right: 0.25em;
        z-index: 99;
    
        float: right;
        transform: translateY(85%);
    }
    

    【讨论】:

      【解决方案2】:

      我就是这样做的(适应你的例子):

      <form name="nameForm" [formGroup]="nameForm">
      <fieldset>
              <label for="username">Username</label>
              <input
                required
                id="username"
                formControlName="username"
              >
              <span
                class="text-danger"
                [hidden]="nameForm.controls.name.valid || itemForm.controls.name.pristine"
              >
                <small>{{'Please enter your name'}}</small>
              </span>
            </fieldset>
      </form>
      

      在您的 TS 文件中:

      import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';
      
      export class InputComponent  {   
         public nameForm: FormGroup;
        constructor(private formBuilder: FormBuilder) {
      
        this.nameForm = this.formBuilder.group({
        username:    new FormControl('', Validators.required),
         });
        }
      //... codes..
      }
      

      您可以在CSS(或任何替代)文件中自定义text-danger

      【讨论】:

      • 我有这样的想法,但我想让它更有活力,对不起,我最初的帖子可能会误导你,我想根据错误有不同的消息,所以我想要一个函数之类的东西这将在字段无效并更改错误标签时执行。因此,例如,如果错误来自 Validator.required - 它会说“请输入您的姓名”,但如果它来自 Validators.minLength - 它会说“输入至少 3 个字符”或类似的内容
      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 2019-06-11
      • 2015-10-23
      相关资源
      最近更新 更多