Angular 2: Form bağlı olmadığı için form gönderme iptal edildi


84

Form içeren bir modal var, modal yok edildiğinde konsolda şu hatayı alıyorum:

Form bağlı olmadığı için form gönderme iptal edildi

Modal, en üst düzey öğemin <modal-placeholder>doğrudan alt öğesi olan öğeye eklenir <app-root>.

DOM'dan bir formu kaldırmanın ve Angular 2'de bu hatayı gidermenin doğru yolu nedir? Şu anda kullanıyorumcomponentRef.destroy();


1
Olası Hata
Saravana

formu saklayıp gösteren bir * ngIf var mıydı?
mickdev

@mickdev no * ngIf, modu bu şekilde yok edersem soruma componentRef.destroy();daha fazla ayrıntı ekledim. Teşekkürler!
nick

2
@mickdev Formu gizlemek ve göstermek için * ngif kullanırsam ne yapmalıyım
Jun711

Yanıtlar:


184

Bunun olmasının başka nedenleri olabilir, ancak benim durumumda tarayıcı tarafından bir gönder düğmesi olarak yorumlanan bir düğmem vardı ve bu nedenle, hataya neden olan düğme tıklandığında form gönderilmişti. Type = "button" eklenmesi sorunu çözdü. Tam öğe:

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

36
Bu cevabın neden kabul edildiğinden emin değilim, çünkü bunu yaparken formu göndermek için enter tuşuna basma yeteneğinizi kaybedersiniz.
Peter LaBanca

7
Nour'un cevabı en basit olanıdır ve anahtar girmeye izin verir.
Heiner

2
Bu, formu sayfadan bir * ngIf yönergesi aracılığıyla kaldıran forma bir İPTAL düğmesi uyguladığımdaki sorunumu çözdü. Formu da kaldırmak için mantığı tetikleyen bir KAYDET düğmesine sahibim (başarılı kaydetmede) ancak bu hata mesajı, type = 'button' sahip olmasam bile onunla hiç görünmedi.
AlanObject

3
Benim durumumda bu hata bir İptal düğmesinde meydana geliyordu, bu yüzden iyi oldu type="button":)
Marcos Lima

Bence bu cevabın, formlarınızda hangi düğmenin gönder düğmesi olduğunu açıkça belirtmeniz gerektiği için iyi olduğunu düşünüyorum. Gönderim için kullanılan yanlış düğmenin bu sorununu çözmenin yanı sıra, gönderimler için enter tuşunu kullanmaya devam etmenize olanak tanır.
Justin

84

Form etiketinde aşağıdakileri yazmalısınız:

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

ve formun içinde gönder düğmesine sahip olmanız gerekir:

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

Ve en önemlisi, formunuzda başka düğmeler varsa type="button"bunlara eklemelisiniz . Varsayılan typeniteliği bırakmak (ki öyle olduğunu düşünüyorum submit) uyarı mesajına neden olacaktır.

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

2
Sanırım # myForm = "ngForm" gerekli değil.
Heiner

Haklısınız, ngForm referansına ihtiyacınız olmadıkça gerekli değildir.
Nour

Bunu çözmenin doğru yolu budur. Bu, enter tuşuna basarak gönderme yeteneğini korurken mesajdan kurtulur.
William Stevens

bu kabul edilen bir cevap olmalıdır
nt4f04und

24

Bu yüzden, bir modelin dahil olmaması dışında, bugün aynı problemle karşılaştım. Formumda iki düğmem var. Formu gönderen ve tıklandığında önceki sayfaya yönlendiren biri.

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

RouterLink ile ilk düğmeye tıklamak, tam olarak yapması gerekeni yapar, ancak görünüşe göre formu da göndermeye çalışır ve daha sonra formun bulunduğu sayfa gönderim sırasında DOM'den kaldırıldığı için form gönderimini terk etmek zorundadır.

Bu, tüm sayfa yerine bir modal olması dışında, başınıza gelenle aynı gibi görünüyor.

İkinci düğmenin türünü doğrudan gönder dışında bir şey olarak belirtirseniz sorun çözülür.

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

Bu nedenle, bir 'İptal' düğmesi veya benzeri bir şey aracılığıyla modeli kapatıyorsanız, yukarıda gösterildiği gibi bu düğmenin türünü belirtmeniz sorununuzu çözecektir.


6

Form öğesinde, aşağıdaki gibi gönderme yöntemini (ngSubmit) tanımlamanız gerekir: <form id="currency-edit" (ngSubmit)="onSubmit(f.value)" #f="ngForm">

ve gönder düğmesinde tıklama yöntemini atlarsınız, çünkü formunuz artık gönderme yöntemine bağlıdır: <button class="btn btn-success" type="submit">Save</button>Düğme, gönderme türünde olmalıdır.

Bileşenin arkasındaki kodda "onSubmit" yöntemini uygularsınız, örneğin şuna benzer bir şey: onSubmit(value: ICurrency) { ... } Bu yöntem, form alanlarından değerler içeren bir değer nesnesi alıyor.


Teşekkürler, formunuzda hala button type = "submit" kullanmak istiyorsanız, bu kabul edilen cevap olmalıdır
Fjut

4

Formun gönderilmesine bileşenin imhası eşlik ediyorsa, Formun DOM'dan çıkarılmasıyla Form gönderme yarış durumunda başarısız olur. Söyle, bizde

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

Eğer saveData(bu API çağrısı aracılığıyla verileri kaydeder örneğin) zaman uyumsuz olduğu o zaman sonucu bekleyin edilebilir:

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

Formu derhal terk etmeniz gerekiyorsa, sıfır gecikmeli bir yaklaşım da işe yaramalıdır. Bu, DOM ayrılmasının Form gönderimi çağrıldıktan sonra sonraki olay döngüsünde olmasını garanti eder:

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

Bu, düğme türünden bağımsız olarak çalışmalıdır.


2

Son zamanlarda bu sorunu yaşadım ve event.preventDefault()benim için çalıştım. Tıklama etkinliği yönteminize ekleyin.

<button type="submit" (click)="submitForm($event)" mat-raised-button>Save</button>

Ve:

submitForm(event: Event) {
  event.preventDefault();
  // ...
}

2
Bu cevap için yeterli detay yok. Bu yazının zaten birkaç çözümü olduğundan, bu çözümün listelenen diğer çözümlerden nasıl farklı veya daha iyi olduğunu lütfen ikna edici bir şekilde açıklayın. Lütfen göndermeden önce SO yönergelerini okuyun.
kıvılcım

1
@sparkplug gatekeep yok, bu cevap daha fazla ayrıntıya ihtiyaç duysa bile faydalı oldu.
Will Shaver

Will Shaver - Faydalı olabilir. İyi biçimlendirilmiş ve yorumlaması kolay, o kadar da değil. Bir SO kullanıcısının okuyup anlaması için yanıtların kolay olmasını sağlamak için standartlar mevcuttur. @Dhilt'in cevabı, takip etmesi daha kolay olan daha ayrıntılı bir çözüm örneğidir.
kıvılcım

0

Bunu Angular 6'da, hiç gönderme düğmesi olmasa bile görüyorum. aynı şablonda birden çok form olduğunda gerçekleşir. bir çözüm olup olmadığından / çözümün ne olduğundan emin değilim.


0

Bu uyarıyı aldım, düğme türünü "gönder" i "düğme" olarak değiştirdim sorunu çözüldü.


0

Yine de düğmenin işlevselliğini "gönder" türünde sürdürmek istiyorsanız, bu düğmedeki tıklama olayını kullanmamalısınız. Bunun yerine formdaki ngSubmit olayını kullanmalısınız.

Misal:

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

-1

Belki de form gönderiminizde başka bir sayfaya yönlendiriliyorsunuz. routerlinkŞablona geçmek yerine aşağıdaki örnekte olduğu gibi programlı rota navigasyonunu kullanın :

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.