Angular 5 ngModel устанавливает значение по умолчанию на основе ввода формы

У меня есть приложение, встроенное в Angular 5 с использованием базы данных Firebase в реальном времени. Моя форма использует ngModel и имеет поле идентификатора пользователя и настраиваемое поле имени пользователя. Мне нужно, чтобы имя пользователя имело значение по умолчанию для идентификатора пользователя, если только пользователь не решит его изменить.

<label class="label-control" for="idInput">User Name</label>
<input id="userId" type="text" for="idInput" class="form-control"
       required minlength="1" name="userId"
       [(ngModel)]="userData.userId"
       #userId="ngModel"
       placeholder="e.g. johnhancock1776"
       />

<label class="label-control" for="vanityInput">Your Custom URL</label>
<input id="vanityId" type="text"
       for="vanityInput" 
       class="form-control"
       name="vanityId"
       [(ngModel)]="userData.vanityId"
       value="{{userData.userId}}"
       #vanityId="ngModel"
       placeholder="custom url" />

Когда пользователь вводит свой идентификатор пользователя, поле идентификатора тщеславия заполняется, но не отправляет данные в базу данных, пока не добавит или не удалит что-то из поля тщеславия.

Я попытался добавить:

       [ngModelOptions]="{updateOn: 'submit'}"

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

1 ответ

Решение

Вы могли бы использовать (ngModelChange) событие, чтобы изменить значение userData.vanityId вместо value="{{userData.userId}}" потому что вы изменяете только представление, а не значение userData.vanityId.

component.html

<label class="label-control" for="idInput">User Name</label>
<input id="userId" type="text" for="idInput" class="form-control"
       required minlength="1" name="userId"
       [(ngModel)]="userData.userId"
       #userId="ngModel"
       placeholder="e.g. johnhancock1776"
       (ngModelChange)="changeVanityId($event)"
       />
<br>
<label class="label-control" for="vanityInput">Your Custom URL</label>
<input id="vanityId" type="text"
       for="vanityInput" 
       class="form-control"
       name="vanityId"
       [(ngModel)]="userData.vanityId"
       #vanityId="ngModel"
       placeholder="custom url" />

<button (click)="sendBackend()">Send</button>

Я добавил кнопку для печати значения userData, чтобы убедиться, что вы печатаете правильное значение.

component.ts

  /**
   * Print in console
   */
  sendBackend() {
    console.log(this.userData);
  } 

  /**
   * Change value of vanityId
   */
  changeVanityId(event) {
    this.userData.vanityId = event
  }

Я реализую это здесь: https://stackblitz.com/edit/angular-sadk7e

Другие вопросы по тегам