【问题标题】:Angular (v4) form data object not matching json dataAngular(v4)表单数据对象与json数据不匹配
【发布时间】:2017-05-16 10:35:01
【问题描述】:

我在 Angular (v4) 中设置了以下表单

我正在拉取以下 json 数据

db.json 文件内容

{
  "customer": {
    "title": "",
    "firstName": "D",
    "lastName": "",
    "address": {
        "line1": "",
        "line2": "",
        "town": "",
        "postcode": ""
    },
    "acceptData": false
  }
}

但是当我显示表单输出 <pre>{{ form.value | json }}</pre> 时,我得到以下 JSON 数据

形成数据

{
  "title": "",
  "firstName": "D",
  "lastName": "",
  "line1": "",
  "line2": "",
  "town": "",
  "postcode": "",
  "acceptData": false
}

您可以看到地址对象丢失了,我确定我做错了什么,很简单,但一直盯着代码几个小时,无法修复它。我希望customer 对象与上面db.json 的内容相匹配。

表格标记

<form (ngSubmit)="handleSubmit(form.value, form.valid)" #form="ngForm" novalidate>

    <select
      id="title"
      name="title"
      [ngModel]="details?.title"
      (ngModelChange)="details.title=$event">
      <option value="" selected>Select</option>
      <option value="Mr">Mr</option>
      <option value="Mrs">Mrs</option>
    </select>


    <label for="firstName">First name</label>
    <input
      type="text"
      name="firstName"
      id="firstName"
      maxlength="20"
      required
      #firstName="ngModel"
      [ngModel]="details?.firstName"
      (ngModelChange)="details.firstName=$event"
      [ngClass]="{ 'error': firstName.errors?.required && firstName.dirty }">
      <!--
        Display invalid error based on firstName.error value
        In case there is no inital value - hide it by checking .dirty value which would be false -->
    <div *ngIf="firstName.errors?.required && firstName.dirty" class="error">First name is required</div>

    <label for="lastName">Last name</label>
    <input
      type="text"
      name="lastName"
      id="lastName"
      maxlength="20"
      required
      #lastName="ngModel"
      [ngModel]="details?.lastName"
      (ngModelChange)="details.lastName=$event">
    <div *ngIf="lastName.errors?.required && lastName.dirty" class="error">Last name is required</div>

    <label for="address">Address
      <input
        type="text"
        name="line1"
        [ngModel]="details?.address.line1"
        (ngModelChange)="handleChange($event)"
        placeholder="Line1">
        <input
        type="text"
        name="line2"
        [ngModel]="details?.address.line2"
        (ngModelChange)="details.address.line2=$event"
        placeholder="Line2">
        <input
        type="text"
        name="town"
        [ngModel]="details?.address.town"
        (ngModelChange)="details.address.town=$event"
        placeholder="town">
        <input
        type="text"
        name="postcode"
        [ngModel]="details?.address.postcode"
        (ngModelChange)="details.address.postcode=$event"            
        placeholder="postcode">
    </label>

    <label>
      <input
        type="checkbox"
        name="acceptData"
        [ngModel]="details?.acceptData"
        (ngModelChange)="details.acceptData=$event">
    </label>

    <button
      type="submit"
      [disabled]="form.invalid">
      Submit
    </button>

    <div>
      <br />
      Form Data
      <pre>{{ form.value | json }}</pre>
    </div>

  </form>

非常感谢任何帮助

【问题讨论】:

    标签: javascript json angular


    【解决方案1】:

    只需包装以下表单控件:

    "line1": "",
    "line2": "",
    "town": "",
    "postcode": ""
    

    在带有ngModelGroup的div内

    <div ngModelGroup="address">
       <!-- input fields belonging to address here --> 
    </div>
    

    DEMO

    您似乎还想将所有内容包装在 customer 中以匹配 JSON?然后做同样的事情,用ngModelGroup="customer"包装所有东西

    【讨论】:

    • 完美运行 - 正是我所追求的
    • 很高兴听到它有帮助!祝你有美好的一天,快乐的编码! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多