Tránh Angular2 để gửi biểu mẫu một cách có hệ thống khi nhấp vào nút


107

Ok vì vậy có thể điều này là không rõ ràng. Nhận biểu mẫu này:

<form (ngSubmit)="submit()" #crisisForm="ngForm">
   <input type="text" name="name" [(ngModel)]="crisis.name">
   <button type="submit">Submit</button>
   <button type="button" (click)="preview()">Preview</button>
   <button type="reset" (click)="reset()">Reset</button>
</form>

Tại sao tất cả các nút đều kích hoạt submit()chức năng? Và làm thế nào để tránh điều đó?


1
trả về sai; từ hàm submit () của bạn
Aran Dekar

Câu trả lời:


213

Tôi thấy hai tùy chọn để giải quyết nó:

1) Chỉ định rõ ràng type = "button" (tôi nghĩ nó thích hợp hơn ):

<button type="button" (click)="preview();">Preview</button>

Theo đặc điểm kỹ thuật W3:

  • http://w3c.github.io/html-reference/button.html

    Một yếu tố nút với không có loại thuộc tính quy định hiện điều tương tự như một nút phần tử với bộ loại thuộc tính của nó để "submit" .

2) Sử dụng $event.preventDefault():

<button (click)="preview(); $event.preventDefault()">Preview</button>

hoặc là

<button (click)="preview($event);">Preview</button>

preview(e){
  e.preventDefault();
  console.log('preview')
}

3
(click)="preview(); false"cũng nên làm như vậy. Ví dụ: stopPropagation()sẽ cần phải được gọi một cách rõ ràng, nhưng nếu một trình xử lý sự kiện trả về false, thì sự kiện đó preventDefaultsẽ được gọi.
Günter Zöchbauer

1
@ Günter Zöchbauer Cảm ơn bạn rất nhiều vì đã chỉ ra điều này! Thứ nhất tôi đã cố gắng nó nhưng tôi đã viết return falsevà nó đã không làm việc :)
yurzui

1
returncó thể không được phép trong các biểu thức ràng buộc nhưng giá trị của biểu thức cuối cùng được trả về một cách ngầm định.
Günter Zöchbauer

2
Sử dụng # 2 có vẻ là câu trả lời tốt nhất. Chỉ cần nói thêm: type = "button" để nút của tôi giải quyết vấn đề
Michael Washington

1
Tôi không biết về type=buttonthông số kỹ thuật của W3C. Cảm ơn bạn!!
Hugo H

17

Plunker này gợi ý ngược lại, mọi nút dường như hoạt động như dự định.

Tuy nhiên, để ngăn hành vi mặc định của biểu mẫu, bạn có thể làm điều này,


TS:

submit(e){
 e.preventDefault();
}

Bản mẫu:

<form (submit)="submit($event)" #crisisForm="ngForm">

Cảm ơn cho câu trả lời và plnkr ... Đó là tất cả về kiểu nút plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
KFA

thật ! nó là. và bạn đã xác định trên tất cả các nút, vì vậy nó đã hoạt động như dự định
Ankit Singh

7

Tôi thấy rằng với bản phát hành 2.0 (ngSubmit)đang chuyển một nullgiá trị sự kiện cho phương thức, vì vậy thay vào đó bạn nên chúng tôi(submit)

<form (submit)="submit($event)" #crisisForm="ngForm">

tệp .ts của bạn

submit($event){
   /* form code */
   $event.preventDefault();
}

Cảm ơn bạn! Điều này làm việc, dont knwo tại sao ngSubmit hoạt động khi không được sử dụng như một nhóm hình thức, nhưng khi tôi sử dụng nó như là một nhóm hình thức tôi phải sử dụng giải pháp của bạn
Nikhil Das Nomula

Tôi đã đưa ra câu trả lời này một thời gian trước khi phiên bản 2.0 vừa mới được phát hành, nhưng sau khi góc 2 đã đi một chặng đường dài, vì vậy bạn có chắc mình đang sử dụng phiên bản phát hành mới nhất không?
imal hasaranga perera


6

Tôi có cùng một vấn đề. Công việc xung quanh tôi đã tìm thấy là thay thế buttonbằng avà áp dụng kiểu nút cho phần tử neo:

<form (ngSubmit)="submit()" #crisisForm="ngForm">
   <input type="text" name="name" [(ngModel)]="crisis.name">
   <button type="submit">Submit</button>
   <a class="btn" (click)="preview()">Preview</a>
   <a class="btn" (click)="reset()">Reset</a>
</form>

6

Bạn phải nhập FormsModule từ '@ angle / form' trong app.module.ts của mình

import { FormsModule } from '@angular/forms';
 @NgModule({
  imports: [
    FormsModule
 ],
 })
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.