フォームを含むモーダルがあります。モーダルが破棄されると、コンソールに次のエラーが表示されます。
フォームが接続されていないため、フォームの送信がキャンセルされました
モーダルは、私の最上位<modal-placeholder>
要素である、の直接の子である要素に追加され<app-root>
ます。
DOMからフォームを削除し、Angular 2でこのエラーを取り除く正しい方法は何ですか?私は現在使用していますcomponentRef.destroy();
フォームを含むモーダルがあります。モーダルが破棄されると、コンソールに次のエラーが表示されます。
フォームが接続されていないため、フォームの送信がキャンセルされました
モーダルは、私の最上位<modal-placeholder>
要素である、の直接の子である要素に追加され<app-root>
ます。
DOMからフォームを削除し、Angular 2でこのエラーを取り除く正しい方法は何ですか?私は現在使用していますcomponentRef.destroy();
componentRef.destroy();
ます。質問に詳細を追加しました。ありがとう!
回答:
これが発生する他の理由があるかもしれませんが、私の場合、ブラウザによって送信ボタンとして解釈されるボタンがあったため、ボタンがクリックされたときにフォームが送信され、エラーが発生しました。type = "button"を追加すると、問題が修正されました。完全な要素:
<button type="button" (click)="submitForm()">
type="button"
:)
フォームタグには、次のように記述します。
<form #myForm="ngForm" (ngSubmit)="onSubmit()">
フォーム内に送信ボタンが必要です。
<button type="submit"></button>
そして最も重要なことは、フォームに他のボタンがある場合はtype="button"
、それらに追加する必要があります。デフォルトのtype
属性(私が思うにsubmit
)をそのままにしておくと、警告メッセージが表示されます。
<button type="button"></button>
だから私は実際にモーダルが関与していないことを除いて、今日まったく同じ問題に遭遇しました。私のフォームには、2つのボタンがあります。フォームを送信するものと、クリックすると前のページに戻るものです。
<button class="btn btn-default" routerLink="/events">Cancel</button>
<button type="submit" class="btn btn-primary">Submit</button>
routerLinkで最初のボタンをクリックすると、想定どおりに動作しますが、フォームの送信も試行されるようです。送信中にフォームが表示されていたページがDOMからマウント解除されるため、フォームの送信を中止する必要があります。
これは、ページ全体ではなくモーダルを使用することを除いて、あなたに起こっていることとまったく同じように見えます。
2番目のボタンのタイプを送信以外のものに直接指定すると、問題は修正されます。
<button type="button "class="btn btn-default" routerLink="/events">Cancel</button>
したがって、「キャンセル」ボタンなどを使用してモーダルを閉じる場合は、上記のようにそのボタンのタイプを指定すると、問題が解決するはずです。
フォーム要素で、次のような送信メソッド(ngSubmit)を定義する必要があります。
<form id="currency-edit" (ngSubmit)="onSubmit(f.value)" #f="ngForm">
フォームが送信方法に接続されているため、送信ボタンではクリック方法を省略します
<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
が非同期の場合(たとえば、API呼び出しを介してデータを保存する場合)、結果を待つことがあります。
submitForm() {
this.saveDataAsync().subscribe(
() => this.abandonForm(),
(err) => this.processError(err) // may include abandonForm() call
);
}
フォームをすぐに破棄する必要がある場合は、ゼロ遅延アプローチも機能するはずです。これにより、フォームの送信が呼び出された後、DOMデタッチが次のイベントループにあることが保証されます。
submitForm() {
this.saveData();
setTimeout(() => this.abandonForm());
}
これは、ボタンのタイプに関係なく機能するはずです。
私は最近この問題を抱えていてevent.preventDefault()
、私のために働きました。クリックイベントメソッドに追加します。
<button type="submit" (click)="submitForm($event)" mat-raised-button>Save</button>
そして:
submitForm(event: Event) {
event.preventDefault();
// ...
}
フォーム送信で他のページにルーティングしている可能性があります。次の例のようrouterlink
に、テンプレートに渡すのではなく、プログラムによるルートナビゲーションを使用します。
router.navigate(['/your/router/path'])