【问题标题】:How to post value in the nested json array in angular 5?如何在角度 5 的嵌套 json 数组中发布值?
【发布时间】:2019-02-07 18:08:03
【问题描述】:

我已经从 Web API 公开了嵌套的 json 格式。有人可以帮我从 Angular5 发送相同格式的数据

{"contractId":1,
 "contractName":"Temp",
 "contractServiceList":[
    {"id":1,
     "serviceId":{"serviceId":1,"serviceName":"Emergency Room"},
     "providerTier":"Tier 1",
     "coinsurance":100.0,
     "copay":10.0,
     "penaltyApplies":"Y",
     "penaltyRule":"Non Emergency ER Use",
     "penaltyType":"Dollar Amount",
     "penaltyValue":300.0,
     "deductibleApplies":"Y"
    }
  ]
}

下面是一段代码,它将内部列表“contractServiceList”设为空。如何订阅数据以便获取内部列表中的值

app.component.ts

ngOnInit() {
    this.addForm = this.formBuilder.group({
          contractName: ['', Validators.required],
          serviceName: ['', Validators.required],
          copayAmount: ['', Validators.required],
          coInsurance: ['', Validators.required],
          deductibleApplies: ['', Validators.required],
          penaltyApplies: ['', Validators.required],
          penaltyRule: ['', Validators.required],
          penaltyType: ['', Validators.required],
          penaltyValue: ['', Validators.required],
          deductibleAppliesPenalty: ['', Validators.required]
    });
}
onSubmit() {
    this.contractService.saveContract(this.addForm.value)
    .subscribe( data => {
        alert('Contract created successfully');
        console.log(data);
    });
}

service.ts

 saveContract(contract: Contract) {
    return this.http.post(this.baseUrl, contract).pipe(map(res => res.json));
  }

app.component.html

<form [formGroup]="addForm" (ngSubmit)="onSubmit()">
  <table>
<thead></thead>
<tbody>
<tr>
   <td>
   <div class="form-group col-xs-6">
      <label for="contractName">Contract Name:</label>
      <input formControlName="contractName" placeholder="Contract Name" class="form-control" name="contractName" id="contractName">
    </div>
   </td>
<td>
 <div class="form-group col-xs-6">
     <h4 style="margin-left:100px;">Penalty Conditions</h4>
    </div>
</td>
</tr>
<tr>
     <td>
    <div class="form-group col-xs-6">
      <label for="serviceName">Category Of Services:</label>
      <select id ="serviceName" formControlName="serviceName" name="serviceName" class="form-control">
    <option *ngFor="let serv of serviceId" [value]="serv.serviceId">{{serv.serviceName}}</option>
</select>
      </div>
    </td>
<td>
 <div class="form-group col-xs-6">
      <label for="penaltyApplies">Penalty Applies:</label>
       <select id ="penaltyApplies" formControlName="penaltyApplies" name="penaltyApplies" class="form-control">
    <option>--Select--</option>
    <option>Y</option>
    <option>N</option>
</select>
</div>
</td>
</tr>
<tr>
    <td>
    <div class="form-group col-xs-6">
      <label for="copayAmount">Copay Amount:</label>
      <input formControlName="copayAmount" placeholder="Copay Amount" class="form-control" name="copayAmount" id="copayAmount">
    </div>
    </td>
    <td>
    <div class="form-group col-xs-6">
      <label for="penaltyRule">Penalty Rule:</label>
       <select id ="penaltyRule" formControlName="penaltyRule" name="penaltyRule" class="form-control">
    <option>--Select--</option>
    <option>Non Emergency ER Use</option>
</select>
      </div>
    </td>
    </tr>
<tr>
    <td>
    <div class="form-group col-xs-6">
      <label for="deductibleApplies">Deductible Applies:</label>
        <select id ="deductibleApplies" formControlName="deductibleApplies" name="deductibleApplies" class="form-control">
    <option>--Select--</option>
    <option>Y</option>
    <option>N</option>
</select></div>
    </td>
    <td>
    <div class="form-group col-xs-6">
      <label for="penaltyType">Penalty Type:</label>
      <select id ="penaltyType" name="penaltyType" formControlName="penaltyType" class="form-control">
    <option>--Select--</option>
    <option>Coinsurance</option>
    <option>Dollar Amount</option>
</select></div>
    </td>
    </tr>

【问题讨论】:

    标签: angular spring-boot angular5 angular6


    【解决方案1】:

    Meenal,ContractServiceList 是一个数组,所以你必须使用一个 ArrayForm。我建议总是做一个函数来返回一个表单

    export class TabGroupBasicExample implements OnInit {
      addForm:FormGroup;
    
      //this function make easier access to the Form array
      get contractList() {
         return this.addForm.get('contractServiceList') as FormArray;
      }
      constructor(private formBuilder:FormBuilder){}
    
      //this function return a FormGroup empty or filled with the data
      createForm(data:any):FormGroup
      {
        return this.formBuilder.group({
          contractId: [data? data.contractId:'',Validators.required],
          serviceName: [data? data.serviceName:''], 
          //to return the array we use a function that return an array of FormGroup
          contractServiceList:this.formBuilder.array(
                 this.createContractService(data?data.contractServiceList:null)
                  )
          });
      }
    
      //see that createContractService return an array of FormGroup
      createContractService(data:any[]|null):FormGroup[]
      {
            //if receive a data array, for each item in array return 
            //a fromGroup with the value    
        return data?
          data.map(x=>{
            let group=this.formBuilder.group({
              copayAmount: [x.copayAmount, Validators.required],
              coInsurance: [x.coInsurance, Validators.required],
              deductibleApplies: [x.deductibleApplies, Validators.required],
              penaltyApplies: [x.penaltyApplies, Validators.required],
              penaltyRule: [x.penaltyRule, Validators.required],
              penaltyType: [x.penaltyType, Validators.required],
              penaltyValue: [x.penaltyValue, Validators.required],
              deductibleAppliesPenalty: [x.deductibleAppliesPenalty, Validators.required]
                });
            return group;
          }):
          [this.formBuilder.group(
            {
              copayAmount: ['', Validators.required],
              coInsurance: ['', Validators.required],
              deductibleApplies: ['', Validators.required],
              penaltyApplies: ['', Validators.required],
              penaltyRule: ['', Validators.required],
              penaltyType: ['', Validators.required],
              penaltyValue: ['', Validators.required],
              deductibleAppliesPenalty: ['', Validators.required]
            })]
      }
    
    
      ngOnInit()
      {
        this.addForm=this.createForm(null)
        }
    }
    

    更新 如果你有像

    这样的对象
    let contrat={
      "contractId": "2",
      "serviceName": "qqqq",
      "contractServiceList": [
        {
          "copayAmount": "12",
          "coInsurance": "22553",
          "deductibleApplies": "12",
          "penaltyApplies": "",
          "penaltyRule": "",
          "penaltyType": "1",
          "penaltyValue": "",
          "deductibleAppliesPenalty": "2"
        }
      ]
    }
    

    你可以做

    this.addForm=this.createForm(contract)
    

    然后您就可以准备好更新的值了。

    您的 .html 必须考虑到您正在使用 formArray

        <form *ngIf="addForm" [formGroup]="addForm" >
          <!--or your fileds not in array-->
           <input formControlName="contractId"/>
           <input formControlName="serviceName">
          <!--Your form Array name---->
        <div formArrayName="contractServiceList">
        <!--a div *ngFor over addForm.get('contractServiceList').controls 
         don't forget formGroupName="i"-->
        <div *ngFor="let items of contractList.controls; let i=index" 
                [formGroupName]="i">
    
             <!--al your controls of the array here-->
           <input formControlName="copayAmount"/>
           <input formControlName="coInsurance"/>
           ....
        </div>
    </div>
    <!--just for check -->
    <pre>{{addForm?.value |json}}</pre>
    

    你想制作一个表格,更改.html

    更新 2 如果我们想验证 formArray 本身,我们可以构建一个自定义验证器。好吧,我喜欢将自定义验证器作为自己组件中的函数。对于更普遍的自定义验证器-多个组件中的用户-请参阅https://angular.io/guide/form-validation#custom-validators

    所以,我们可以在component.ts中添加

       arrayValidator(){
    
        return (control: FormArray) => {
          console.log(control.value);
          //using value, you return an object if error or null
          return null;
        }
      }   
    

    并在创建数组时更改为

      contractServiceList:this.formBuilder.array(
             this.createContractService(data?data.contractServiceList:null),
             this.arrayValidator()
              )
    

    【讨论】:

    • service.ts 怎么样,这是发布数据的正确方式吗?
    • 好吧。我不知道你的API。返回一个result.json很奇怪,但我不知道。 (我认为你的“http”是 HttpClient angular.io/guide/http(不是旧的和已弃用的 http)
    • 感谢您在这方面的努力,但我的不好,仍然不清楚我们正在取得什么成就。如果您详细解释您的建议会很好,因为我对 Angular 很陌生。 this.addForm=this.createForm(null) - 这是否总是 createForm 为空。请分享基于上述 json 的 HTML 的确切代码。
    • @Meenal,我制作了一个 stackblizt stackblitz.com/edit/… 这个想法是,当您阅读一份合同时(使用 httpClient.get("url...").subscribe(res=> ..)您可以格式化读取的数据的表单宽度,以便您可以更新。通常操作 New 和 Update 是在 uniq 组件中进行的。我更新我的答案
    • 太棒了!它对我有用。非常感谢你,但只有一个帮助。我想在同一个表单本身上添加搜索功能,因此一旦单击搜索按钮,值将自动填充到相同的 html 中,并且 Save btn 将被隐藏。那么,我是否可以在同一个 component.ts 中有另一个表单,并且在 html 中会执行 *ngIf="searchForm" 以便根据表单条件显示相应的表单。请提出建议,否则我将使用另一个新页面来提供搜索功能。
    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 2018-12-21
    • 2015-10-25
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多