首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用指令格式化日期和更新输入,但验证器不喜欢它

使用指令格式化日期和更新输入,但验证器不喜欢它
EN

Stack Overflow用户
提问于 2019-08-04 01:31:51
回答 2查看 847关注 0票数 0

我有一个为date of birth (道布)创建的formControl字段。我的目标是让我的指令在他们使用MMDDYYYY输入日期时将我的日期字段输入到MM/DD/YYYY中,这一指令做得很好。我在道布字段上也有一个验证器(使用reactive form方法),它使用正则表达式来验证条目是否为日期。

验证器将表单标记为有错误。在调试时,我发现指令正确地更新了输入表单的值,但在继续调试其余代码(内置Angular)时,其余代码(似乎是处理验证的代码)仍然可以看到旧值(示例02022010)。我是Angular和Javascript的新手,所以我唯一的想法是这可能是一个作用域问题?

我试着只使用验证器而不使用指令,以确保模式被正确注册。该模式确实验证了date字段的正确性,所以我不认为Validator.pattern在这里是一个坏模式的问题。

以下帖子:Validate md-datepicker using formcontrol与我的关系密切,但它对我没有帮助,我也没有使用datepicker或想要datepicker。

app.component.ts

代码语言:javascript
运行
复制
import { Component } from '@angular/core';
import { FormsModule, ReactiveFormsModule, FormGroup, FormControl, Validators } from '@angular/forms';

@Component({
  selector: 'app-root',
  template: `
  <form [formGroup]='searchForm'>
  <input #firstNameField formControlName='firstName' placeholder="Enter first name">
  <input #lastNameField formControlName='lastName' placeholder="Enter last name">
  <input #dobField formControlName='dob' placeholder='MM/DD/YYYY' autocomplete="off" appDOBinput></form>
  <div *ngIf="searchForm.controls['dob'].hasError('pattern')">Date is invalid</div>
  `,
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  searchForm: FormGroup;
  // tslint:disable-next-line: max-line-length
  REGEX = RegExp('^(?:(?:10|12|0?[13578])/(?:3[01]|[12][0-9]|0?[1-9])/(?:1[8-9]\\d{2}|[2-9]\\d{3})|(?:11|0?[469])/(?:30|[12][0-9]|0?[1-9])/(?:1[8-9]\\d{2}|[2-9]\\d{3})|0?2/(?:2[0-8]|1[0-9]|0?[1-9])/(?:1[8-9]\\d{2}|[2-9]\\d{3})|0?2/29/[2468][048]00|0?2/29/[3579][26]00|0?2/29/[1][89][0][48]|0?2/29/[2-9][0-9][0][48]|0?2/29/1[89][2468][048]|0?2/29/[2-9][0-9][2468][048]|0?2/29/1[89][13579][26]|0?2/29/[2-9][0-9][13579][26])$');

  constructor() {
    this.searchForm = new FormGroup({
      firstName: new FormControl(''),
      lastName: new FormControl(''),
      dob: new FormControl('', { validators: Validators.pattern(this.REGEX), updateOn: 'blur' })
    });
  }
}

date-input.directive.ts

代码语言:javascript
运行
复制
import { Directive, HostListener } from '@angular/core';
import { NgControl } from '@angular/forms';

@Directive({
  selector: '[formControlName] [appDOBinput]',
})
export class DateInputDirective {

  constructor(public ngControl: NgControl) { }

  @HostListener('ngModelChange', ['$event'])
  onModelChange(event) {
    this.onInputChange(event, false);
  }

  @HostListener('keydown.backspace', ['$event'])
  keydownBackspace(event) {
    this.onInputChange(event.target.value, true);
  }

  onInputChange(event, backspace) {
    let newVal = event.replace(/\D/g, '');
    if (backspace && newVal.length <= 6) {
      newVal = newVal.substring(0, newVal.length - 1);
    }
    if (newVal.length === 0) {
      newVal = '';
    } else if (newVal.length <= 3) {
      newVal = newVal.replace(/^(\d{0,2})/, '$1/');
    } else if (newVal.length <= 4) {
      newVal = newVal.replace(/^(\d{0,2})(\d{0,2})/, '$1/$2/');
    } else {
      newVal = newVal.replace(/^(\d{0,2})(\d{0,2})(\d{0,4})/, '$1/$2/$3');
    }
    console.log('value in directive: ' + newVal);
    this.ngControl.valueAccessor.writeValue(newVal);
  }
}

该指令的控制台输出显示了正确的输出,例如输入02022010将输出02/02/2010。但是,如果我最终继续一步一步地调试(在core.js这样的文件中),我会看到value字段仍然是02022010。一旦完成了所有逻辑,日期字段之后的输出就是'Date is invalid‘

这几乎就像是验证所涉及的逻辑仍然使用旧值。

EN

回答 2

Stack Overflow用户

发布于 2019-08-04 01:43:21

我认为验证日期的正则表达式有问题。尝尝这个

/^((0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2})*$

票数 0
EN

Stack Overflow用户

发布于 2019-08-05 14:38:52

对于验证日期,您可以使用@rxweb/reactive-form-validatorsdate验证器,而无需创建任何自定义指令或函数,它将允许您根据您的格式验证日期

代码语言:javascript
运行
复制
 ngOnInit() {
        this.searchForm = this.formBuilder.group({
            birthDate:['', RxwebValidators.date()], 
        });
    }

您只需要在app模块中导入RxReactiveFormsModule即可

下面是完整的组件代码:

代码语言:javascript
运行
复制
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder } from "@angular/forms"
import { RxwebValidators } from '@rxweb/reactive-form-validators';

@Component({
    selector: 'app-date-add-validator',
    templateUrl: './date-add.component.html'
})
export class DateAddValidatorComponent implements OnInit {
    searchForm: FormGroup

	constructor(
        private formBuilder: FormBuilder )
	{ }

    ngOnInit() {
        this.searchForm = this.formBuilder.group({
            birthDate:['', RxwebValidators.date()], 
        });
    }
}
代码语言:javascript
运行
复制
<div>
  <form  [formGroup]="searchForm">
    <div class="form-group">
      <label>Birth Date</label>
      <input type="text" formControlName="birthDate" class="form-control"  />
      <small class="form-text text-muted">You must enter a valid date only<br/></small>
     <small class="form-text text-danger" *ngIf="searchForm.controls.birthDate.errors">{{searchForm.controls.birthDate.errors.date.message}}<br/></small>	
    </div>
    <button [disabled]="!searchForm.valid" class="btn btn-primary">Submit</button>
  </form>
</div>

工作Example

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57340650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档