Angular 2: Gửi biểu mẫu bị hủy vì biểu mẫu không được kết nối


82

Tôi có một phương thức chứa một biểu mẫu, khi phương thức bị hủy, tôi gặp lỗi sau trong bảng điều khiển:

Gửi biểu mẫu bị hủy vì biểu mẫu không được kết nối

Phương thức được thêm vào một <modal-placeholder>phần tử là phần tử con trực tiếp <app-root>, phần tử cấp cao nhất của tôi.

Cách chính xác để xóa biểu mẫu khỏi DOM và loại bỏ lỗi này trong Angular 2 là gì? Tôi hiện đang sử dụngcomponentRef.destroy();



bạn có * ngNếu ẩn và hiện biểu mẫu không?
mickdev

@mickdev no * ngNếu tôi phá hủy phương thức như thế này componentRef.destroy();, tôi đã thêm nhiều chi tiết hơn cho câu hỏi của mình. Cảm ơn!
nick

2
@mickdev Tôi nên làm gì nếu tôi sử dụng * ngif để ẩn và hiển thị biểu mẫu
711

Câu trả lời:


179

Có thể có những lý do khác khiến điều này xảy ra nhưng trong trường hợp của tôi, tôi có một nút được trình duyệt hiểu là nút gửi và do đó biểu mẫu đã được gửi khi nút được nhấp vào gây ra lỗi. Thêm loại = "nút" đã khắc phục sự cố. Phần tử đầy đủ:

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

33
Tôi không chắc tại sao câu trả lời này được chấp nhận, bởi vì khi làm điều này, bạn sẽ mất khả năng nhấn enter để gửi biểu mẫu.
Peter LaBanca

7
Câu trả lời của Nour là câu trả lời đơn giản nhất và cho phép nhập phím.
Heiner

2
Điều này đã khắc phục sự cố của tôi khi tôi triển khai nút HỦY đối với biểu mẫu đã xóa biểu mẫu khỏi trang thông qua lệnh * ngIf. Tôi có nút LƯU để kích hoạt logic cũng xóa biểu mẫu (khi lưu thành công) nhưng thông báo lỗi này không bao giờ xuất hiện với nó mặc dù tôi không có loại = 'nút'.
AlanObject

3
Trong trường hợp của tôi lỗi này đã xảy ra trên một nút Cancel, vì vậy nó là tốt tôi thêm type="button":)
Marcos Lima

Tôi nghĩ câu trả lời này tốt ở chỗ bạn nên trình bày rõ ràng trong các biểu mẫu của mình về nút nào là nút gửi. Nó giải quyết vấn đề nút sai được sử dụng để gửi cũng như cho phép bạn tiếp tục sử dụng phím enter để gửi.
Justin

80

Trong thẻ biểu mẫu, bạn nên viết như sau:

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

và bên trong biểu mẫu, bạn nên có nút gửi:

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

Và quan trọng nhất, nếu bạn có bất kỳ nút nào khác trong biểu mẫu của mình, bạn nên thêm type="button"vào chúng. Để lại typethuộc tính mặc định (mà tôi nghĩ là submit) sẽ gây ra thông báo cảnh báo.

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

2
Tôi nghĩ rằng # myForm = "ngForm" là không bắt buộc.
Heiner

Bạn đúng, trừ khi bạn cần tham chiếu đến ngForm thì không bắt buộc.
Nour

Đây là cách chính xác để giải quyết nó. Thao tác này giúp loại bỏ thông báo trong khi vẫn giữ khả năng gửi bằng cách nhấn enter.
William Stevens

24

Vì vậy, tôi thực sự vừa gặp phải cùng một vấn đề ngày hôm nay ngoại trừ không có phương thức liên quan. Trong hình thức của tôi, tôi có hai nút. Một cái gửi biểu mẫu và một cái, khi được nhấp vào, sẽ định tuyến trở lại trang trước.

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

Nhấp vào nút đầu tiên với routerLink thực hiện chính xác những gì nó phải làm, nhưng dường như cũng cố gắng gửi biểu mẫu, và sau đó phải bỏ gửi biểu mẫu vì trang mà biểu mẫu đã ở trên đó không được gắn kết khỏi DOM trong quá trình gửi.

Điều này dường như giống hệt điều đang xảy ra với bạn, ngoại trừ với một phương thức thay vì toàn bộ trang.

Sự cố sẽ được khắc phục nếu bạn trực tiếp chỉ định loại nút thứ hai là thứ gì đó khác với gửi.

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

Vì vậy, nếu bạn đang đóng phương thức thông qua nút 'Hủy' hoặc thứ gì đó thuộc loại này, việc chỉ định loại nút đó, như được hiển thị ở trên, sẽ giải quyết được vấn đề của bạn.


6

Trong phần tử biểu mẫu, bạn cần xác định phương thức gửi (ngSubmit), giống như: <form id="currency-edit" (ngSubmit)="onSubmit(f.value)" #f="ngForm">

và trên nút gửi, bạn bỏ qua phương thức nhấp vì biểu mẫu của bạn hiện được kết nối với phương thức gửi: <button class="btn btn-success" type="submit">Save</button>Nút phải thuộc loại gửi.

Trong mã phía sau thành phần bạn triển khai phương thức "onSubmit", ví dụ như sau: onSubmit(value: ICurrency) { ... } Phương thức này đang nhận một đối tượng giá trị với các giá trị từ các trường biểu mẫu.


Cảm ơn, đây sẽ là câu trả lời được chấp nhận nếu bạn vẫn muốn loại nút sử dụng = "submit" vào mẫu của bạn
Fjut

4

Trong trường hợp việc gửi Biểu mẫu đi kèm với việc phá hủy thành phần, thì việc gửi Biểu mẫu không thành công trong điều kiện chạy đua với việc tách Biểu mẫu khỏi DOM. Nói rằng, chúng tôi có

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

Nếu không đồng bộ saveData(ví dụ: nó lưu dữ liệu thông qua lệnh gọi API) thì chúng tôi có thể đợi kết quả:

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

Nếu bạn cần từ bỏ Biểu mẫu ngay lập tức, thì cách tiếp cận không trì hoãn cũng sẽ hoạt động. Điều này đảm bảo tách DOM sẽ ở trong vòng lặp sự kiện tiếp theo sau khi gửi Biểu mẫu đã được gọi:

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

Điều này sẽ hoạt động bất kể loại nút nào.


2

Tôi đã gặp vấn đề này gần đây và event.preventDefault()đã làm việc cho tôi. Thêm nó vào phương pháp sự kiện nhấp chuột của bạn.

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

Và:

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

2
Không có đủ chi tiết cho câu trả lời này. Vui lòng giải thích một cách thuyết phục cách giải pháp này khác hoặc tốt hơn các giải pháp khác được liệt kê vì bài đăng này đã có một số giải pháp. Vui lòng đọc hướng dẫn SO trước khi đăng.
sparkplug

1
@sparkplug đừng gác cổng, câu trả lời này rất hữu ích, ngay cả khi nó cần thêm chi tiết.
Will Shaver

Will Shaver - Có thể hữu ích. Được định dạng tốt và dễ hiểu, không quá nhiều. Các tiêu chuẩn được đưa ra để đảm bảo người dùng SO có thể đọc và hiểu câu trả lời dễ dàng. Câu trả lời của @dhilt là một ví dụ về giải pháp chi tiết hơn, dễ làm theo hơn.
sparkplug

0

Tôi thấy điều này trong Angular 6, ngay cả khi không có nút gửi nào cả. xảy ra khi có nhiều biểu mẫu trong cùng một mẫu. không chắc liệu có giải pháp không / giải pháp là gì.


0

tôi đã có cảnh báo này, tôi đã thay đổi loại nút "gửi" thành "nút" đã được giải quyết.


0

Nếu bạn vẫn muốn duy trì chức năng của nút thuộc loại "gửi", thì bạn không nên sử dụng sự kiện nhấp vào nút đó. Thay vào đó, bạn nên sử dụng sự kiện ngSubmit trên biểu mẫu.

Thí dụ:

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

-1

Có thể bạn đang định tuyến đến một số trang khác trong quá trình gửi biểu mẫu của mình. Sử dụng điều hướng tuyến đường có lập trình, như trong ví dụ sau, thay vì chuyển routerlinkvào mẫu:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.