【问题标题】:Angular - FormArray, how to reset a specific field of a formArray?Angular - FormArray,如何重置 formArray 的特定字段?
【发布时间】:2019-05-06 16:57:38
【问题描述】:

我不知道如何重置 FormArray 的单个字段,例如:

myForm = this.fb.group(
        {
            title: ["", [Validators.required, Validators.minLength(4)]],
            date: ["", Validators.required],
            pairs: this.fb.array(
                this.fPairs.map(f =>
                    this.fb.group({
                        score: [],
                        value: [],
                        valueRel: []
                    })
                )
            )
        },
        {
            validator: minMaxValidator
        }
    );

所以我的 FormArray 是一个包含 4 个对象的数组,因为它是从以下位置映射的:

fPairs: Array<fPairs> = [
        {score: 0, value: 0, valueRel: 0},
        {score: 0, value: 0, valueRel: 0},
        {score: 0, value: 0, valueRel: 0},
        {score: 0, value: 0, valueRel: 0}
    ];

到目前为止,要重置表单的这一部分,我所取得的成就是:

pairsControl= this.myForm.controls["pairs"] as FormArray;

然后使用:

this.pairsControl.reset();

但这会重置 FormArray 的每个字段,而我想要的是只能重置特定字段,

例如所有 4 个对象的“score" 字段,同时保留完整的 value 和 valueRel 字段

我试过了:

this.fixedPointsControl.reset(["score"]);

但它的作用是像之前的表达式一样重置所有内容,所以没有任何变化!

重置 formArray 的特定字段的正确方法是什么?

【问题讨论】:

    标签: javascript angular forms formarray formgroups


    【解决方案1】:

    如果你的 FormArray 中有 4 个字段,你可以通过它的索引来重置它,因为 FormArray 里面是一个 FormGroup 的数组,所以你可以通过它的索引来访问它。

    已创建Stackblitz Demo 供您参考

    const pairs = this.myForm.get['pairs'] as FormArray;   // Use 'get' instead of 'controls'
    
    // Iterates the Pairs' FormArray controls and use patchValue if you want to reset or assign a new value to a particular property
    pairs.controls.forEach(pair => pair.patchValue({ score: '' }));
    

    【讨论】:

    • 感谢您的回答。如果没有“控件”,它将无法工作,我得到:无法读取未定义的属性“重置”!但是,如果我保持“控制”,它会起作用!但是有一个问题,您的解决方案会重置整个第一个表单组!我不希望这样,例如,我想为所有 4 个组重置属性“分数”!但保持其他属性不变!
    • @AJ989 更新了我的答案并提供了 Stackblitz 演示链接。希望它有所帮助:)
    • 非常感谢您的回答!它有效,但我将使用上面提出的其他解决方案,因为它实际上重置了字段而不是将其设置为'',但真的很感激帮助!如果您有机会成为 FormArray 的专家,昨天我发布了一个关于同一个 formArray 的验证器问题的问题,如果您知道解决方案,我会很高兴听到它!谢谢
    【解决方案2】:

    只需创建一个pairs getter 即可获得pairs FormArray。现在在resetField 方法中设置一个名为fieldName 的参数,该参数期望pairs 上的文件名FormArrayreset

    类似这样的:

    get pairs() {
      return (<FormArray>this.myForm.get('pairs'));
    }
    
    resetField(fieldName) {
      this.pairs.controls.forEach(group => group.get(fieldName).reset());
    }
    

    然后将这些按钮添加到您的模板中:

    <button (click)="resetField('score')">Reset Score</button> | 
    <button (click)="resetField('value')">Reset Value</button> | 
    <button (click)="resetField('valueRel')">Reset Value Rel</button>
    

    这里有一个Working Sample StackBlitz 供您参考。

    【讨论】:

    • 完美,我将使用这个而不是下面的那个,因为它实际上使用了 reset()!我对昨天发布的同一个 formArray 有另一个问题,如果您有任何线索,仍在寻求帮助,它是关于验证器的!无论如何感谢您的帮助
    • @AJ989,当然。请分享一个链接。
    猜你喜欢
    • 2019-01-31
    • 2021-10-29
    • 2019-02-10
    • 2018-08-10
    • 2017-11-16
    • 2020-06-30
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多