Angular 2 : 양식이 연결되지 않았기 때문에 양식 제출이 취소되었습니다.


82

양식이 포함 된 모달이 있는데, 모달이 파괴되면 콘솔에 다음 오류가 발생합니다.

양식이 연결되지 않아 양식 제출이 취소되었습니다.

모달은 내 최상위 요소 인에 <modal-placeholder>직접 자식 인 요소에 추가됩니다 <app-root>.

DOM에서 양식을 제거하고 Angular 2에서이 오류를 제거하는 올바른 방법은 무엇입니까? 나는 현재componentRef.destroy();



양식을 숨기고 표시하는 * ngIf가 있습니까?
mickdev

@mickdev no * ngIf, 나는 이와 같이 모달을 파괴하면 componentRef.destroy();내 질문에 더 많은 세부 사항을 추가했습니다. 감사!
nick

2
@mickdev * ngif를 사용하여 양식을 숨기고 표시하는 경우 어떻게해야합니까
Jun711

답변:


179

다른 이유가있을 수 있지만 제 경우에는 브라우저에서 제출 버튼으로 해석 한 버튼이있어서 버튼을 클릭했을 때 양식이 제출되어 오류가 발생했습니다. type = "button"을 추가하면 문제가 해결되었습니다. 전체 요소 :

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

33
이 답변이 수락 된 이유를 잘 모르겠습니다. 이렇게하면 Enter 키를 눌러 양식을 제출할 수 없기 때문입니다.
Peter LaBanca

7
Nour의 대답은 가장 간단하며 Enter 키를 허용합니다.
Heiner

2
이것은 * ngIf 지시문을 통해 페이지에서 양식을 제거하는 양식에 CANCEL 버튼을 구현하는 문제를 해결했습니다. (성공적인 저장시) 양식을 제거하는 로직을 트리거하는 SAVE 버튼이 있지만 type = 'button'이 없더라도이 오류 메시지가 나타나지 않았습니다.
AlanObject

3
내 경우에는이 오류는 그래서 좋은 나는 추가, 취소 단추에서 발생했다 type="button":
마르코스 리마

제출 버튼이 어떤 버튼인지에 대해 양식에 명시해야한다는 점 에서이 답변이 좋습니다. 제출에 잘못된 버튼이 사용되는 문제를 해결하고 제출을 위해 Enter 키를 계속 사용할 수 있습니다.
Justin

80

양식 태그에 다음을 작성해야합니다.

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

양식 안에 제출 버튼이 있어야합니다.

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

그리고 가장 중요한 것은 양식에 다른 버튼이있는 경우 추가해야한다는 type="button"것입니다. 기본 type속성 (내 생각에는 submit)을 그대로 두면 경고 메시지가 표시됩니다.

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

2
# myForm = "ngForm"이 필요하지 않다고 생각합니다.
Heiner

ngForm에 대한 참조가 필요하지 않는 한 당신이 옳습니다.
Nour

이것은 그것을 해결하는 올바른 방법입니다. 이렇게하면 Enter 키를 눌러 제출할 수있는 기능을 유지하면서 메시지가 제거됩니다.
William Stevens

24

그래서 나는 모달을 사용하지 않는 것을 제외하고는 실제로 똑같은 문제에 직면했습니다. 내 양식에는 두 개의 버튼이 있습니다. 양식을 제출하는 하나와 클릭하면 이전 페이지로 다시 라우팅되는 하나.

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

routerLink로 첫 번째 버튼을 클릭하면 예상대로 정확히 양식을 제출하려고 시도한 다음 양식이있는 페이지가 제출 중에 DOM에서 마운트 해제되기 때문에 양식 제출을 포기해야합니다.

이것은 전체 페이지가 아닌 모달을 제외하고는 당신에게 일어나는 것과 똑같은 일로 보입니다.

두 번째 버튼의 유형을 제출 이외의 것으로 직접 지정하면 문제가 해결됩니다.

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

따라서 '취소'버튼 또는 이와 유사한 것을 통해 모달을 닫는 경우 위에 표시된대로 해당 버튼의 유형을 지정하면 문제가 해결됩니다.


6

양식 요소에서 다음과 같이 제출 방법 (ngSubmit)을 정의해야합니다. <form id="currency-edit" (ngSubmit)="onSubmit(f.value)" #f="ngForm">

이제 양식이 제출 방법에 연결되었으므로 제출 단추에서 클릭 방법을 생략합니다 <button class="btn btn-success" type="submit">Save</button>. 단추는 제출 유형이어야합니다.

컴포넌트 뒤에있는 코드에서 "onSubmit"메소드를 구현합니다. 예를 들어 다음과 같습니다. onSubmit(value: ICurrency) { ... } 이 메소드는 양식 필드에서 값이있는 값 객체를 수신합니다.


감사합니다. 양식에 type = "submit"버튼을 계속 사용하려면이 답변이 허용됩니다.
Fjut

4

Form 제출이 컴포넌트의 파괴를 수반하는 경우 Form 제출은 DOM에서 Form을 분리하여 경쟁 조건에서 실패합니다. 말해, 우리는

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());
}

이것은 버튼 유형에 관계없이 작동합니다.


2

나는 최근 에이 문제가 있었고 event.preventDefault()나를 위해 일했습니다. 클릭 이벤트 메소드에 추가하십시오.

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

과:

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

2
이 답변에 대한 세부 정보가 충분하지 않습니다. 이 게시물에는 이미 여러 솔루션이 있으므로이 솔루션이 나열된 다른 솔루션과 어떻게 다르거 나 더 나은지 설득력있게 설명하십시오. 게시하기 전에 SO 지침을 읽으십시오.
sparkplug

1
@sparkplug는 게이트 키프하지 않습니다.이 답변은 더 자세한 정보가 필요하더라도 유용했습니다.
Will Shaver

Will Shaver-유용 할 수도 있습니다. 형식이 잘 지정되어 있고 해석하기 쉽습니다. SO 사용자가 쉽게 읽고 이해할 수 있도록 답변을 제공하기위한 표준이 마련되어 있습니다. @dhilt의 대답은 따라 가기 쉬운 더 자세한 솔루션의 예입니다.
sparkplug

0

제출 버튼이 전혀 없어도 Angular 6에서 이것을 볼 수 있습니다. 동일한 템플릿에 여러 양식이있을 때 발생합니다. 해결책이 있는지 / 해결책이 무엇인지 확실하지 않습니다.



0

단추의 기능을 "제출"유형으로 유지하려면 해당 단추에 대한 클릭 이벤트를 사용하지 않아야합니다. 대신 양식에서 ngSubmit 이벤트를 사용해야합니다.

예:

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

-1

양식 제출의 다른 페이지로 라우팅 할 수 있습니다. routerlink템플릿으로 전달하는 대신 다음 예제와 같이 프로그래밍 방식 경로 탐색을 사용합니다 .

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.