您可能有多种类型的提交行为,例如,返回到另一个页面或停留在表单上。 您可以通过指定 onSubmitMeta 属性来实现这一点。此元数据将传递给 onSubmit 函数。
注意:如果调用 form.handleSubmit() 时没有元数据,它将使用提供的默认值。
import { Component } from '@angular/core';
import { injectForm } from '@tanstack/angular-form';
type FormMeta = {
submitAction: 'continue' | 'backToMenu' | null;
};
// 调用 form.handleSubmit() 不需要元数据。
// 指定如果没有传递元数据时使用的默认值
const defaultMeta: FormMeta = {
submitAction: null,
};
@Component({
selector: 'app-root',
template: `
<form (submit)="handleSubmit($event)">
<button type="submit" (click)="
handleClick({ submitAction: 'continue' })
">提交并继续</button>
<button type="submit" (click)="
handleClick({ submitAction: 'backToMenu' })
">提交并返回菜单</button>
</form>
`,
})
export class AppComponent {
form = injectForm({
defaultValues: {
data: '',
},
// 定义提交时期望的元数据值
onSubmitMeta: defaultMeta,
onSubmit: async ({ value, meta }) => {
// 对通过 handleSubmit 传递的值进行处理
console.log(`Selected action - ${meta.submitAction}`, value);
},
});
handleSubmit(event: SubmitEvent) {
event.preventDefault();
event.stopPropagation();
}
handleClick(meta: FormMeta) {
// 覆盖在 onSubmitMeta 中指定的默认值
this.form.handleSubmit(meta);
}
}
import { Component } from '@angular/core';
import { injectForm } from '@tanstack/angular-form';
type FormMeta = {
submitAction: 'continue' | 'backToMenu' | null;
};
// 调用 form.handleSubmit() 不需要元数据。
// 指定如果没有传递元数据时使用的默认值
const defaultMeta: FormMeta = {
submitAction: null,
};
@Component({
selector: 'app-root',
template: `
<form (submit)="handleSubmit($event)">
<button type="submit" (click)="
handleClick({ submitAction: 'continue' })
">提交并继续</button>
<button type="submit" (click)="
handleClick({ submitAction: 'backToMenu' })
">提交并返回菜单</button>
</form>
`,
})
export class AppComponent {
form = injectForm({
defaultValues: {
data: '',
},
// 定义提交时期望的元数据值
onSubmitMeta: defaultMeta,
onSubmit: async ({ value, meta }) => {
// 对通过 handleSubmit 传递的值进行处理
console.log(`Selected action - ${meta.submitAction}`, value);
},
});
handleSubmit(event: SubmitEvent) {
event.preventDefault();
event.stopPropagation();
}
handleClick(meta: FormMeta) {
// 覆盖在 onSubmitMeta 中指定的默认值
this.form.handleSubmit(meta);
}
}
虽然 Tanstack Form 为验证提供了 Standard Schema 支持,但它不会保留模式的输出数据。
传递给 onSubmit 函数的值始终是输入数据。要接收标准模式的输出数据,请在 onSubmit 函数中解析它:
import { z } from 'zod'
// ...
const schema = z.object({
age: z.string().transform((age) => Number(age)),
})
// Tanstack Form 使用标准模式的输入类型
const defaultValues: z.input<typeof schema> = {
age: '13',
}
// ...
@Component({
// ...
})
export class AppComponent {
form = injectForm({
defaultValues,
validators: {
onChange: schema,
},
onSubmit: ({ value }) => {
const inputAge: string = value.age
// 通过模式传递以获取转换后的值
const result = schema.parse(value)
const outputAge: number = result.age
},
})
}
import { z } from 'zod'
// ...
const schema = z.object({
age: z.string().transform((age) => Number(age)),
})
// Tanstack Form 使用标准模式的输入类型
const defaultValues: z.input<typeof schema> = {
age: '13',
}
// ...
@Component({
// ...
})
export class AppComponent {
form = injectForm({
defaultValues,
validators: {
onChange: schema,
},
onSubmit: ({ value }) => {
const inputAge: string = value.age
// 通过模式传递以获取转换后的值
const result = schema.parse(value)
const outputAge: number = result.age
},
})
}