Проверка шаблона Angular в элементе управления формой завершается с ошибкой, пока вы не отредактируете поле

#angular

#angular

Вопрос:

У меня есть проект Angular, и в нем есть реактивная форма. Два поля принимают введенную вручную дату в формате ‘дд / мм / гггг’. При создании нового элемента с помощью формы проверка работает отлично. Но, когда я устанавливаю значения в форме с помощью patchValues , проверка шаблона в двух полях даты завершается с ошибкой. Однако, если вы удалите символ из даты и повторно введете его, проверка пройдет.

Я создаю форму следующим образом;

 this.form = new FormGroup({
      id: new FormControl(''),
      active: new FormControl(false),
      name: new FormControl('', [Validators.required]),
      availableFrom: new FormControl('', [Validators.required, Validators.pattern(/^(((0[1-9]|[12]d|3[01])/(0[13578]|1[02])/((19|[2-9]d)d{2}))|((0[1-9]|[12]d|30)/(0[13456789]|1[012])/((19|[2-9]d)d{2}))|((0[1-9]|1d|2[0-8])/02/((19|[2-9]d)d{2}))|(29/02/((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g)]),
      availableTo: new FormControl('', [Validators.required, Validators.pattern(/^(((0[1-9]|[12]d|3[01])/(0[13578]|1[02])/((19|[2-9]d)d{2}))|((0[1-9]|[12]d|30)/(0[13456789]|1[012])/((19|[2-9]d)d{2}))|((0[1-9]|1d|2[0-8])/02/((19|[2-9]d)d{2}))|(29/02/((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g)]),
      fuelTypes: new FormControl(null, Validators.required),
      position: new FormControl('', Validators.required),
      linkUrl: new FormControl('', [this.urlValidator, Validators.pattern(urlPattern)]),
      imageUrl: new FormControl('', Validators.required),
      reference: new FormControl(''),
      advertiser: new FormControl(''),
      tenants: new FormControl([], Validators.required)
    });
 

и обновление значения forms в onEditAdvert функции;

 onEditAdvert(advert: any) {
    this.form.reset();
    this.form.patchValue({
      id: advert.id,
      active: advert.active,
      name: advert.name,
      linkUrl: advert.linkUrl,
      imageUrl: advert.imageUrl,
      availableFrom: advert.availableFrom,
      availableTo: advert.availableTo,
      fuelTypes: advert.fuelTypes,
      position: advert.positionId,
      reference: advert.reference,
      advertiser: advert.advertiser,
      tenants: [...advert.tenants.map(item => item), 0]
    });
    this.form.get('availableFrom').updateValueAndValidity(); // Added to try and fix the issue
    this.form.get('availableTo').updateValueAndValidity(); // Added to try and fix the issue

    this.advertModal.show();
  }
 

Итак, кажется, что значения в поле, например 01/01/2020, недопустимы при установке через patchValues , но действительны, если вы вводите их вручную.

Может ли кто-нибудь пролить свет на то, почему это может происходить?

Редактировать:

Просто убедитесь, что это полезно. Значения для даты извлекаются через API, а значения даты преобразуются в строку с использованием этого метода;

 public static DateStringToString(dateStr: string): string {
    const dateTime = dateStr.split('T');
    const parts = dateTime[0].split('-');

    return parts[2]   '/'   parts[1]   '/'   parts[0];
  }
 

Возвращаемое значение из этого метода — это то, что задается в полях формы.

HTML для самих полей формы очень прост.

 <div class="col-6">
              <div class="form-group">
                <label>Start Date</label>
                <input type="text" formControlName="availableFrom" placeholder="dd/mm/yyyy">
              </div>
            </div>

            <div class="col-6">
              <div class="form-group">
                <label>End Date</label>
                <input type="text" formControlName="availableTo" placeholder="dd/mm/yyyy">
              </div>
            </div>
 

Если я специально укажу значения для исправления в форме, а не получу значения из объекта advert, у меня та же проблема.

 availableFrom: '01/01/2020',
availableTo: '01/05/2020',
 

Похоже, проблема связана с шаблоном, который проверяет строку.

Комментарии:

1. не могли бы вы, пожалуйста, указать рабочую ссылку на пример, например, из stackblitz, ее было бы легко проверить и ответить.

2. Когда вы исправляете, вводите ли вы строковые литералы с датами, такими как ’01/01/2020′?

3. Можете ли вы также добавить HTML-код?

4. да, значения, являющиеся исправлениями, — это просто строки, а не даты.