Angular 2: отправка формы отменена, так как форма не подключена

У меня есть модал, который содержит форму, когда модал разрушается, я получаю следующую ошибку в консоли:

Отправка формы отменена, так как форма не связана

Модал добавлен в <modal-placeholder> элемент, который является прямым потомком <app-root>Мой элемент высшего уровня.

Как правильно удалить форму из DOM и избавиться от этой ошибки в Angular 2? Я сейчас пользуюсь componentRef.destroy();

11 ответов

Решение

Это может быть вызвано другими причинами, но в моем случае у меня была кнопка, которая была интерпретирована браузером как кнопка отправки, и, следовательно, форма была отправлена ​​при нажатии кнопки, вызвавшей ошибку. Добавление type="button" решило проблему. Полный элемент:

    <button type="button" (click)="submitForm()">

В теге формы вы должны написать следующее:

 <form #myForm="ngForm" (ngSubmit)="onSubmit()">

и внутри формы вы должны иметь кнопку отправки:

 <button type="submit"></button>

И самое главное, если у вас есть другие кнопки в вашей форме, вы должны добавить type="button" им. Оставляя по умолчанию type атрибут (который я считаю submit) вызовет предупреждение.

<button type="button"></button>

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

<button class="btn btn-default" routerLink="/events">Cancel</button>
<button type="submit" class="btn btn-primary">Submit</button>

Щелчок по первой кнопке с routerLink делает именно то, что он должен, но, по-видимому, также пытается отправить форму, а затем должен отказаться от отправки формы, потому что страница, на которой была форма, отключена от DOM во время отправки.

Похоже, это то же самое, что происходит с вами, за исключением модальной, а не всей страницы.

Проблема исправляется, если вы прямо указываете тип второй кнопки, чтобы она отличалась от отправки.

<button type="button "class="btn btn-default" routerLink="/events">Cancel</button>

Поэтому, если вы закрываете модальное с помощью кнопки "Отмена" или чего-то в этом роде, указание типа этой кнопки, как показано выше, должно решить вашу проблему.

В элементе формы вам нужно определить метод submit (ngSubmit), например: <form id="currency-edit" (ngSubmit)="onSubmit(f.value)" #f="ngForm">

и на кнопке отправки вы опускаете метод click, потому что ваша форма теперь подключена к методу отправки: <button class="btn btn-success" type="submit">Save</button> Кнопка должна иметь тип отправки.

В коде позади компонента вы реализуете метод onSubmit, например, что-то вроде этого: onSubmit(value: ICurrency) {...}Этот метод получает объект значения со значениями из полей формы.

В случае, если отправка Формы сопровождается уничтожением компонента, отправка Формы завершается неудачно в состоянии гонки с отрывом Формы от DOM. Скажем, у нас есть

submitForm() {
  if (this.myForm.invalid) {
    return;
  }
  this.saveData(); // processing Form data
  this.abandonForm(); // change route, close modal, partial template ngIf-destroying etc
}

Если saveData isync (например, он сохраняет данные через вызов API), тогда мы можем дождаться результата:

submitForm() {
  this.saveDataAsync().subscribe(
    () => this.abandonForm(),
    (err) => this.processError(err) // may include abandonForm() call
  );
}

Если вам нужно немедленно отказаться от формы, подход с нулевой задержкой также должен работать. Это гарантирует, что отделение DOM будет в следующем цикле событий после вызова отправки формы:

submitForm() {
  this.saveData();
  setTimeout(() => this.abandonForm());
}

Это должно работать независимо от типа кнопки.

У меня была эта проблема недавно и event.preventDefault() работал на меня. Добавьте его в ваш метод события click.

I resolved the issue by adding the attribute type = "button".

      <button type="button" onClick={props.formHandler}>Cancel</button>

Если вы по-прежнему хотите сохранить функциональность кнопки типа "отправить", вам не следует использовать событие щелчка для этой кнопки. Вместо этого вы должны использовать в форме событие ngSubmit.

Пример:

<form (ngSubmit)="destroyComponent()">
<button type="submit">submit</button>
</form>

У меня было это предупреждение, я изменил тип кнопки "отправить" на "кнопку". Проблема решена.

Я вижу это в Angular 6, даже без кнопок отправки вообще. происходит, когда в одном шаблоне несколько форм. не уверен, есть ли решение / каково решение.

Возможно, вы переходите на другую страницу при отправке формы. Используйте программную навигацию по маршруту, как в следующем примере, вместо передачиrouterlink в шаблон:

router.navigate(['/your/router/path'])

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