【问题标题】:Angular Forms create control for each property of objectAngular Forms 为对象的每个属性创建控件
【发布时间】:2023-03-31 18:04:01
【问题描述】:

我正在尝试创建一个包含多个对象的角形数组,每个对象有 5 个属性。我从 firestore 检索对象数组并将其传递给表单组,我正在努力解决的是如何为每个不同的对象及其属性添加控件。我已经附上了我目前所拥有的sn-p。

第一张图片是我传递给我的表单的对象数组,我使用 html 打印出来

{{m1t1Form.value | json}}

Value: { "players": [ { "kills": 0, "deaths": 0, "damage": 0, "id": "JVnUQRv1YBt9D7JIkWvn", "playerID": "dAS3YyQvTX8ILQQPRxO3" }, { "kills": 0, "deaths": 0, "damage": 0, "id": "OwFBLDgQxDv86TiA2Urc", "playerID": "8ZCqn1NEqPSFchoPjigY" }, { "kills": 0, "deaths": 0, "damage": 0, "id": "UBnQmwiRJwF2HgNYvqGn", "playerID": "xkGVBqn3Pv50vVa5iiO1" }, { "kills": 0, "deaths": 0, "damage": 0, "id": "q4kHgwENnVTuvEIRUpUe", "playerID": "qmKJc03aqmfgAWrZQRzO" }, { "kills": 0, "deaths": 0, "damage": 0, "id": "qh8ZKPLpd64Cq4Ixw6Aa", "playerID": "OLJr4qvdOlFgIcb66iSI" } ] } 

【问题讨论】:

  • 您可以使用动态表单在运行时向表单添加控件。 angular.io/guide/dynamic-form
  • 有可能,但我有一个问题。您想要对数组属性进行任何验证还是只是简单的绑定?请以文本格式而不是图像格式提供 json 结果,以便我为您创建示例。
  • @AjayOjha 我稍后会添加验证,但我想现在只是绑定就可以了。还将json编辑为文本
  • 好的,谢谢,我会尽快更新。
  • 您还想要动态控制吗? IE。杀戮,死亡,伤害?

标签: angular typescript firebase google-cloud-firestore angular-material-6


【解决方案1】:

您好,这可能有助于您绑定我在项目中使用的表单。

constructor(  private formBuilder: FormBuilder)
{
    this.m1t1Form = formBuilder.group({
      'players' : formBuilder.array([])
    });
  }
}


ngAfterViewInit()
{
        for (let i = 0; i < valueObject.players.length; i++) 
        {
            const control = <FormArray>this.m1t1Form.controls['players'];
            control.push(this.initPlayerForm(valueObject.players[i]));
        }
}

initPlayerForm(playerVO : player)
{
    return this.formBuilder.group({
      'kills': [player.kills],
      'death': [player.death],
      'damage': [player.damage],
      'id': [player.id],
      'playerId': [player.playerId]
    });
}

通过这种方式,您可以将表单与任意数量的玩家动态绑定。添加验证对您也很有帮助。

【讨论】:

    【解决方案2】:

    我有同样的功能。下面的代码会帮助你。

    HTML 代码:

                                          <form [formGroup]="m1t1Form" class="form-horizontal">
                                                <div class="form-group">
                                                    <div class="col-md-10">
                                                        <div formArrayName="players" *ngFor="let player of m1t1Form.get('players').controls; let i = index;">
                                                            <div [formGroupName]="i">
                                                                <div class="col-md-5">
                                                                    <input class="form-control col-md-5" formControlName="kills" placeholder="kills">
                                                                </div>
                                                                <div class="col-md-5">
                                                                    <input type="text" placeholder="death" class="form-control col-md-5"
                                                                     formControlName="death">
                                                                </div>
                                                                <button class="btn btn-info btn-xs m-t-sm" type="button" (click)="getPlayerDetails(i)">
                                                                    <i name="save" class="fa fa-eye"></i>
                                                                </button>
                                                            </div>
                                                        </div>
                                                    </div>
                                                </div>
                                            </form>
    

    TS 代码:

        m1t1Form: FormGroup;
        players: FormArray;
    
        ngOnInit(){
    
           // Default adding one object
           this.m1t1Form= new FormGroup({
                'players': new FormArray([this.createItem()])
            });
    
            // Load you data from  service
            let playersData : any[] = []; // Fille data
    
            // Create control dynamically and set value from service data to form
            if (playersData .length > 0) {
                this.players= this.m1t1Form.get('players') as FormArray;
                while (this.players.length) {
                   this.players.removeAt(0);
                }
                this.m1t1Form.patchValue(this.playersData );
                playersData .forEach(player=> 
                this.players.push(this.formBuilder.group(player)));
             }
          }
    
          createItem(): FormGroup {
              return new FormGroup({
                id: new FormControl(),
                kills: new FormControl(),
                death: new FormControl()
              });
           }
    
    
       getPlayerDetails(index: any) {
            if (this.players.at(index).get('id').value) {
                // Do whatever you want to do with id or playerId
            }
        }
    

    【讨论】:

    • 有什么地方可以将 player.id 作为参数传递给函数调用吗?我也有类似的功能使用不同的代码和 idk 更好
    • 您可以将所有字段添加到createItem() 方法,它将绑定到您的表单。
    • 我的意思更像是我想在按钮的(单击)功能中发送 player.id,所以我怎样才能获得该值
    • 它说无法读取未定义的属性,可能是因为当我检索 this.players 中的数据时,它在订阅调用中,我猜在订阅之外它不存在?
    • 你知道我可以如何禁用任何控件吗?我尝试了新的 FormControl({disable:true}) 但没有用
    猜你喜欢
    • 2017-09-05
    • 2019-02-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2021-01-09
    相关资源
    最近更新 更多