You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular响应式表单生成多价格JSON对象问题求助

如何在Angular表单数组中生成包含多个价格的JSON对象?

看起来你遇到的核心问题是表单数组初始化和模板绑定不匹配,导致最终只能获取到一个价格值。让我一步步帮你解决:

问题根源分析

你当前的代码里:

  1. 表单数组tabls只初始化了一个表单组(initArray2()),所以无论模板里有多少个输入框,最终只会提交这一个组的值。
  2. 模板里的两个价格输入框都绑定到了同一个formControlName="price",这会导致第二个输入框直接覆盖第一个的值,最终只保留最后输入的价格。

解决方案步骤

1. 初始化包含两个表单组的表单数组

修改ngOnInit方法,让tabls数组包含两个独立的表单组,分别对应你模板里的两个价格输入项:

ngOnInit() {
  this.myForm = this._fb.group({
    tabls: this._fb.array([
      this.initArray2(), // 对应第一个价格(departure → station)
      this.initArray2()  // 对应第二个价格(departure → arrival)
    ]),
  })
}

initArray2() {
  return this._fb.group({
    price: [''],
  });
}

2. 调整模板绑定,让每个输入框对应独立的表单组

原来的模板把两个输入框放在同一个formGroupName下,现在需要拆分它们,分别绑定到数组的第0和第1个索引:

<div formArrayName="tabls">
  <!-- 第一个价格项:出发地 → 中途站 -->
  <div [formGroupName]="0">
    <div class="row">
      <div class="col-sm-4" >
        <div >
          <div class="inner-addonx left-addon header-search" style="float:left;margin-right: 4px;">
            <i class="glyphicon markerx" style="border: 5px solid #FED141"></i>
          </div>
          <span >{{items.departure}}</span>
        </div>
      </div>
      <div class="col-sm-1" ><img style=" width: 32px; height: 22px;" src="../assets/img/arrow.svg" ></div>
      <div class="col-sm-4" >
        <span *ngIf="items.stations.length > 0"> {{items.stations[0].station}} </span>
        <span *ngIf="items.stations.length === 0"> {{items.arrival}} </span>
      </div>
      <div class="col-sm-3" >
        <div class="input-group " >
          <input type="number" formControlName="price" value="1000" min="0" step="1" 
                 [attr.id]="'textbox'" data-number-to-fixed="2" data-number-stepfactor="100" 
                 class="form-control currency" />
          <span class="input-group-addon">Dhs</span>
        </div>
      </div>
    </div>
    <hr/>
  </div>

  <!-- 第二个价格项:出发地 → 目的地 -->
  <div [formGroupName]="1">
    <div class="row">
      <div *ngIf="items?.arrival && items?.departure">
        <div class="col-sm-4">
          <div style="">
            <div class="inner-addonx left-addon header-search" style="float:left;margin-right: 4px;">
              <i class="glyphicon markerx" style="border: 5px solid #63a599"></i>
            </div>
            <span>{{items.departure}}</span>
          </div>
        </div>
        <div class="col-sm-1" >
          <img style=" width: 32px; height: 22px;" src="../assets/img/arrow.svg" >
        </div>
        <div class="col-sm-4" >
          <div style="">
            <div class="inner-addonx left-addon header-search" style="float:left;margin-right: 4px;">
              <i class="glyphicon markerx" style="border: 5px solid #F53F5B"></i>
            </div>
            <span>{{items.arrival}}</span>
          </div>
        </div>
        <div class="col-sm-3" >
          <div class="input-group ">
            <input type="number" formControlName="price" value="1000" min="0" step="1" 
                   [attr.id]="'finalprice'" data-number-to-fixed="2" data-number-stepfactor="100" 
                   class="form-control currency" />
            <span class="input-group-addon">Dhs</span>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

3. 验证save函数的输出

你的save()函数只需要获取表单的value即可,现在会自动生成你期望的JSON结构:

save() {
  console.log(this.myForm.value);
  // 输出: {"tabls":[{"price":20},{"price":10}]}
}

扩展:如果需要动态添加更多价格项

如果以后需要支持动态添加价格项,可以添加一个按钮和对应的方法:

addPriceItem() {
  const tablsArray = this.myForm.get('tabls') as FormArray;
  tablsArray.push(this.initArray2());
}

模板中添加按钮:

<button class="btn btn-primary" (click)="addPriceItem()">添加新价格项</button>

这样每次点击按钮都会往表单数组里新增一个价格输入项,提交时也会包含所有项的值。

内容的提问来源于stack exchange,提问作者user9192087

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:29:59