Angular Реактивные формы: как reset формировать состояние и сохранять значения после отправки

В реакционной форме Angular. Как reset только состояние формы после успешной отправки?

Вот процесс:

  • Создайте форму и setValue из результата службы
  • Измените значения и отправьте форму
  • Если форма правильно отправлена ​​на обслуживание, то reset и сохранить значения

Как сохранить значения как измененные и reset форму в ее первозданном состоянии.

Форма form.reset() просто пустая. Но если я этого не называю, состояние не reset, и, например, мои проверки в зависимости от классов состояний формы (девственных, грязных, действительных и т.д.) Все еще существуют.

Ответ 1

Решение @smnbbrv работает очень хорошо.

Вы также можете указать фактическое значение формы для метода reset().

Учитывая факт, что myReactiveForm является реактивной формой в вашем компоненте. После успешной отправки вашей формы (например, путем вызова службы), вы можете:

this.myReactiveForm.reset(this.myReactiveForm.value);

Это будет reset форма и задайте значения "новой" формы для того же значения, которое вы создали.

Этот метод можно увидеть в примере Tour of Hero Официальный Angular.io doc

Ответ 2

Это довольно легко:

this.form.markAsPristine();
this.form.markAsUntouched();

Это сбрасывает метаданные формы, и форма снова начинается.

Ответ 3

Внимание для пользователей angular/material2

Есть дополнительная сложность, если вы используете угловые элементы управления материалом, с mat-error для отображения ваших ошибок. Такие ошибки отображаются на основе результата ErrorStateMatcher (в дополнение к любому *ngIf вы, возможно, применили).

По умолчанию ErrorStateMatcher отображает ошибки, если верно следующее:

isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean 
{
   return !!(control && control.invalid && (control.touched || (form && form.submitted)));
}

Так что это говорит о том, что если форма когда-либо была отправлена и элемент управления становится недействительным (согласно правилам валидации), то будет отображаться ошибка. Это часто не то, что вы хотите (особенно если вы читаете этот вопрос!).

Глядя на исходный код - нет способа установить resetForm submitted = false если вы не resetForm resetForm для директивы ngForm (не для объекта FormGroup). Установка состояний как нетронутых или нетронутых не сбрасывает представленные в false.

Если вы используете mat-error вам может быть проще создать собственный ErrorStateMatcher (простой интерфейс) для пользовательской логики, если это проблема.

Также обратите внимание, что ErrorStateMatcher только в угловом материале - и не является частью стандартных угловых форм.

Ответ 4

Для реактивных форм, что работало для меня при использовании angular 7: было использовать шаблонно-управляемую форму и передавать ее через обработчик отправки формы следующим образом

// component.html
 <form #f="ngForm" [formGroup]="form" (ngSubmit)="onSubmit(f)" novalidate>
 ....
</form>


// component.ts

onSubmit(form: NgForm) {

// reset form here
 form.form.markAsPristine();
 form.resetForm();
}

Это сбросит форму и отправленное состояние по умолчанию.