我正在试图弄清楚如何将形状数组修补成一个类型的react 角形式.PatchValue和setValue在我的脑海中并不一致,例如,对于FormControl. 这是一张表格

 this.form = fb.group<IPersonForm>({
      name: new FormControl<string | null>('bob'),
      phones: new FormArray<FormGroup<IPhoneForm>>([]),
    });

我可以很容易地修补名称控件:

this.form.controls.name.patchValue('Jim', { onlySelf: true, emitEvent: false });

但表单数组是一个挑战.假设我创建了一个replacemenmt数组

const myPhone = this.fb.group<IPhoneForm>({
      phone: new FormControl<string | null | undefined>('bob')
    });
const array = new FormArray<FormGroup<IPhoneForm>>([myPhone]);

现在,如果我try 修补(或设置),两者都不编译:

    //this.form.controls.phones.setValue(array);
    //this.form.controls.phones.setValue(array.controls);
    //this.form.controls.phones.patchValue(array);
    //this.form.controls.phones.patchValue(array.controls);

我可以使用setControl,但该方法没有onlySelf选项:

this.form.setControl('phones', array, { emitEvent: false });

我觉得那里只需要自己,因为如果我要替换数据并有复杂的验证,我不希望它们在任何控件上运行,直到整个表单修补完毕. 谢谢!

这是一个带有演示的堆栈闪电战:https://stackblitz.com/edit/angular-path-typed-array?file=src%2Fmain.ts

推荐答案

您应该向补丁程序传递逻辑值,而不是另一种形式

this.f或m.controls.phones.patchValue([{phone: '123'}]);

this.f或m.patchValue({phones: [{phone: '123'}]})

也可以在一次呼叫中同时使用该名称

this.f或m.patchValue({name: 'Jim', phones: [{phone: '123'}]})

you can add onlySelf 或 emitEvent if you want. they are both unrelated to the question.

Typescript相关问答推荐

TypScript如何在 struct 上定义基元类型?

在Angular中注入多个BrowserModules,但在我的代码中只有一个

如何通过TypeScript中的工厂函数将区分的联合映射到具体的类型(如类)?

无法正确推断嵌套泛型?

路由链接不会导航到指定router-outlet 的延迟加载模块

Fp-ts使用任务的最佳方法包装选项

使用TypeScrip的类型继承

从子类集合实例化类,同时保持对Typescript中静态成员的访问

界面中数组中的混合类型导致打字错误

带投掷的收窄类型

S,为什么我的T扩展未定义的条件在属性的上下文中不起作用?

接口中可选嵌套属性的类型判断

类型判断数组或对象的isEmpty

如何处理可能为空的变量...我知道这不是Null?

TypeScript:如何使用泛型和子类型创建泛型默认函数?

TypeScript是否不知道其他函数内部的类型判断?

Select 器数组到映射器的Typescript 泛型

如何确定单元格中的块对 mat-h​​eader-cell 的粘附(粘性)?

使用react+ts通过props传递数据

如何为对象创建类型,其中键是只读且动态的,但值是固定类型?