버튼 클릭시 체계적으로 양식을 제출하기 위해 Angular2를 피하십시오.


107

그래서 이것은 불분명 한 것 같습니다. 이 양식 받기 :

<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>

모든 버튼이 submit()기능을 트리거하는 이유는 무엇 입니까? 그리고 그것을 피하는 방법?


1
거짓 반환; 당신의 제출 () 함수에서
아란 Dekar

답변:


213

이를 해결하기위한 두 가지 옵션이 있습니다.

1) 명시 적으로 type = "button"을 지정 합니다 ( 더 바람직 하다고 생각합니다 ).

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

W3 사양에 따르면 :

2) 용도 $event.preventDefault():

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

또는

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

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

3
(click)="preview(); false"똑같이해야합니다. 예를 들어 stopPropagation()명시 적으로 호출 할 필요가 있지만, 이벤트 핸들러가 반환하는 경우 false, 다음 preventDefault이벤트에서 호출된다.
Günter Zöchbauer

1
@ Günter Zöchbauer 이것을 지적 해 주셔서 대단히 감사합니다! 첫째로 나는 그것을 시도했지만 내가 쓴 return false그것은 :) 작동하지 않았다
yurzui

1
return바인딩 식에서 허용되지 않을 수 있지만 마지막 식의 값이 암시 적으로 반환됩니다.
Günter Zöchbauer

2
# 2를 사용하는 것이 가장 좋은 대답 인 것 같습니다. 그냥 추가 : 유형 = "버튼을"내 버튼에 해결했다 문제를
마이클 워싱턴

1
나는 type=buttonW3C의 사양 에 대해 몰랐다 . 감사합니다!!
Hugo H

17

이 Plunker 는 그렇지 않으면 모든 버튼이 의도 한대로 작동하는 것처럼 보입니다.

그러나 양식의 기본 동작을 방지하려면 이렇게 할 수 있습니다.


TS :

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

주형:

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

답변과 plnkr에 감사드립니다 ... 버튼 유형에 관한 모든 것입니다 plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
kfa

참으로! 그것은. 의도 한대로 당신은 그것을 작동 그래서, 모든 버튼에 정의
ANKIT 싱

7

2.0 릴리스 (ngSubmit)에서는 null이벤트 값을 메서드에 전달 하므로 대신(submit)

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

.ts 파일

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

감사합니다! 이 일을, 그나마 knwo 형태의 그룹으로 사용하지 않을 때 ngSubmit 작동하지만, 내가 양식 그룹으로 사용할 때 내가 솔루션 사용하는 이유
Nikhil 다스 Nomula

2.0이 방금 출시되었을 때이 답변을했지만 그 후 angular 2가 먼 길을 왔으므로 최신 릴리스 버전을 사용하고 있습니까?
imal hasaranga 페레라


6

나는 같은 문제가 있습니다. 내가 찾은 해결 방법은 앵커 요소에 버튼 스타일을 적용 하고 교체하는 것 button입니다 a.

<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

app.module.ts의 '@ angular / forms'에서 FormsModule을 가져와야합니다.

import { FormsModule } from '@angular/forms';
 @NgModule({
  imports: [
    FormsModule
 ],
 })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.