Предварительно заполненное поле ввода для углового материала не проверяется - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть диалоговое окно, которое открывается с помощью кнопки редактирования в таблице (mat-).Когда диалоговое окно открывается, ему передаются данные для заполнения некоторых полей ввода.
Один из этих входов имеет проверку с правилом, что он не может быть пустым.

Моя проблема в том, что элемент ввода, который получает автоматически заполненное значение, не распознается Angular как имеющий значение вообще (он имеет «значение» в веб-инспекторе и на экране).

Это означает, что до тех пор, пока пользователь не отредактирует поле, либо удалив и повторно введя символ, либо введя что-то новое, кнопка «Сохранить» остается серой.Не все поля необходимо редактировать, если они получают значение, оно является действительным.

Итак, как я могу получить подтверждение того, что поле ввода не пустое, а также что оно имеет значение ?(Причина, по которой я не могу просто удалить проверку, должна иметь значение, т.е. != '').

Таким образом, если пользовательский ввод пуст для начала или пользователь не удаляет ввод, проверка должна пройти.Или, иначе говоря, если входные данные получают значение при открытии диалогового окна, и пользователь оставляет его в покое, проверка должна пройти.

Побочным эффектом от того, что автоматически не вводимые значения не распознаются, является то, что если число не изменяется, то оно отправляется как нулевое на серверную часть.Таким образом, когда данные обновляются в представлении, число, которое было 30 и не было отредактировано пользователем, теперь равно 0. Это потому, что форма отображает автоматически заполненные данные, но почему-то угловые не «видят» их.

простой ввод:

  <div class="form">
    <mat-form-field>
      <input matInput #input
             class="form-control"
             placeholder="Name"
             [(ngModel)]="data.name"
             name="name"
             selected="data.name"
             required
             [value]="this.getFunc?.name"
      >
      <mat-error *ngIf="data.name == ''">{{getErrorMessage()}}</mat-error>
    </mat-form-field>
  </div>

Не уверен, что показать из файлов component.ts здесь (?!)
Используя dialogRef.componentInstance = foo.bar; в родительском компоненте, диалог получает егоправильные значения в полях ввода, и если пользователь удаляет, а затем повторно вводит значение, правильное значение отправляется обратно через API.

Проблема в том, что angular не может «видеть» ввод.
Перепробовал много разных вещей, включая все остальные ответы по SO / здесь.
Извините за длинный текст и небольшой код, но не показывает, как angular не распознает, что поле ввода содержит значение.

1 Ответ

0 голосов
/ 12 сентября 2018

я искал долго и упорно для ответа на этот вопрос, и я думаю, что у меня есть «правильный» путь к нему (один из них, по крайней мере). Так что я выложу здесь:

Сначала я изменил свою форму, чтобы использовать 'formGroup' в элементе формы следующим образом:

<form class="mat-dialog-content" (ngSubmit)="submit()" #formControl="ngForm" [formGroup]="patchForm">
      <div class="form">
        <mat-form-field>
          <input matInput #input
                 class="form-control"
                 placeholder="name"
                 name="name"
                 formControlName="name"
                 id="name"
                 selected="data.name"
                 required
          >
          <mat-error *ngIf="data.name== ''">{{getErrorMessage()}}</mat-error>
        </mat-form-field>
      </div>
      [... repeat div class="form" blocks for other inputs/dropdowns etc ...]

Обратите внимание, что мне пришлось удалить [(ngModel)]="someVal" из всех элементов поля формы. Angular бросает колебание, если вы пытаетесь использовать их с formGroup.

Теперь добавьте атрибут элемента formControlName="name", который вы видите в коде выше.

Затем мне пришлось добавить в app.module.ts ReactiveFormsModule:

import { FormsModule, ReactiveFormsModule } from '@angular/forms';

, а также добавьте это в массив импорта того же файла:

 imports: [
    BrowserModule,
    ...
    FormsModule,
    ReactiveFormsModule
  ],  

В файле component.ts я настроил [formGroup]="patchForm" в соответствии с документацией здесь https://angular.io/api/forms/FormGroup#setvalue
В моем диалоге есть 3 поля:

  patchForm = new FormGroup({
    age: new FormControl(),
    name: new FormControl(),
    numberLegs: new FormControl()
  });

Итак, formControl ожидает объект, соответствующий форме. В моей функции onInit у меня есть вызов API для получения данных, которыми я хочу заполнить форму, и поэтому внутри этого подписчика я использую метод patchValue() из Angular для установки значений:

this.projectService.getProjectFunction(this.projId, this.rowId).subscribe(x=> { 
  this.fetchedProjFunc = x;
  // patchFrom expects an object matching to the formgroup, field by field.
  this.patchForm.patchValue({
    age: this.fetchedProjFunc['age'],
    name: this.fetchedProjFunc['name'],
    numberLegs: this.fetchedProjFunc['numberLegs']
   });
});

Это, похоже, сработало. Затем мне пришлось установить значения объекта, который я возвращал в API / базу данных в моем возвращаемом объекте, чтобы указать правильные значения, поэтому, когда пользователь нажимает кнопку «сохранить», он вызывает функцию «verifyPut», которая содержит объект данные для отправки, вот так:

 public confirmPut(): void {
    this.projectFunction = {
        ...
        name: this.patchForm.value['name'],
        ...

который в свою очередь вызывает функцию, которая выполняет PUT для API.

Я думаю, что именно так, форма проверяет на пустые строки и пропущенные значения, как и ожидалось.

Если я что-то пропустил, и кто-нибудь когда-нибудь прочтет это, дайте мне знать ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...