angular反応型
<form [formGroup]="form" (ngSubmit)="onSubmit()">
送信するボタンが2つあります。ユーザーがボタンを押したときに一般的な操作、つまりフォームを送信する必要がありますが、押したボタンに応じてユーザーを別のページにリダイレクトする必要があるため、ボタンを区別する必要もあります。これが私の2つのボタンです。
<button name="Previous" type="submit" [disabled]="form.invalid"> Previous</button>
<button name="Next" type="submit" [disabled]="form.invalid">Next</button>
OnSubmitイベントでどのボタンが押されたかを知るにはどうすればよいですか?
答えが見つかりました。少しトリッキー:onSubmitイベントで私はチェックします:
var buttonName = document.activeElement.getAttribute("Name");
ユーザーがクリックしたときに、ボタンの1つがフォーム上のアクティブな要素でなければならないので、これは私のためのトリックを行います
このソリューションで試すことができます
component.html
<form [formGroup]="form" (ngSubmit)="onSubmit(buttonType)">
<button type="submit" (click)="onSubmit('Next')">Next</button>
<button type="button" (click)="onSubmit('Previous')">Previous</button>
</form>
component.ts
onSubmit(buttonType): void {
if(buttonType==="Next") {
console.log(buttonType)
}
if(buttonType==="Previous"){
console.log(buttonType)
}
}
これを試して。
あなたのcomponent.ts
import { Component } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
form: FormGroup;
nextClicked = false;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
age: [20],
name: ['asdas']
});
}
public onSubmit(): void {
if(this.nextClicked) {
////
}else {
////
}
}
public onNextClick(): void {
this.nextClicked = true;
}
public onPreviousClick(): void {
this.nextClicked = false;
}
}
そしてcomponent.html
<div>
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<input formControlName="age">
<input formControlName="name">
<button type="submit" (click)="onNextClick()">Next</button>
<button type="submit" (click)="onPreviousClick()">Previous</button>
</form>
</div>
そして、あなたはこれで実例を見つけることができます stackblitz 。
2つの送信ボタンのクリックイベントに2つの個別のイベントハンドラを追加できます。 これらのイベントハンドラーは、onSubmit
メソッドの前にトリガーされます。これらの2つのイベントハンドラーを使用して、コンポーネントの状態を更新し、ユーザーがnextまたはpreviousボタンをクリックしたかどうか。
そして、その状態に応じて、onSubmit
メソッドで異なるページにユーザーを誘導できます。
user1238784、Angularでドキュメントを直接使用しないでください。代わりにElementRefまたはRenderer2を使用してください。これは機能しますが、ベストプラクティスに反するため、Angular Universalをある時点で使用することにした場合、SSRが破損します。
Angularでの直接的なDOM操作は大きなことではありません。フレームワークによって提供されるAPIを使用してDOMを常に操作する必要があります。
しかし、あなたはそれのどれも必要としません、あなたはこのようにパラメータとしてイベントを渡すことができます:
<form [formGroup]="form" (ngSubmit)="onSubmit($event)">
コンポーネントでは、イベントを使用してクリックされたボタンを識別できます
_(click)="buttonClicked='previous/next'"
_イベントをボタンに追加できます(必要に応じて、次/前)。その後、クラス_buttonClicked: string
_にメンバー変数を作成し、onSubmit()
メソッドで読み取り、適切に機能します。
ウィザードを使用している場合は、前のステップで有効性をチェックしない方が良いです!しかし、チェックしたい場合は、ngsubmitを使用することはできませんが、独自のアクションを定義することができます:
html:
<button name="Previous" type="submit" (click)="submitForm('pre')"[disabled]="form.invalid"> Previous</button>
<button name="Next" type="submit" (click)="submitForm('next')" [disabled]="form.invalid">Next</button>
コンポーネント内:
submitForm(type) {
if (!this.form.valid) {
this.checkFormValidity();
return;
}
if(type === 'pre'){
//Redirect one page
}else{
//Redirect another page
}
}
checkFormValidity() {
for (let item in this.form.controls) {
this.form.controls[item].markAsTouched();
}
}