【问题标题】:Reactive Forms Not Updating Value In Form Field Angular 7反应式表单不更新表单字段Angular 7中的值
【发布时间】:2020-09-21 02:41:06
【问题描述】:

我的表单组中的值在提交时没有更新。

我有从 api 引入值的表单组,(它正在工作)但是当我尝试更新值并将其传回时,值没有被更新。我对自己做错了什么感到迷茫。

我在 Angular 7 中使用响应式表单。

modify-view-action.component.html

    <div fxLayout="column" fxLayoutGap="25px" class="modify-view-container">
  <mat-card class="view-settings-descrpition-card">
    <mat-card-content fxLayout="column">

      <form [formGroup]="modifyActionForm">
        <div class="container" fxLayout="row" fxLayoutGap="25px">
          <div class="column1" fxLayout="column">
            <p>Folder: {{dbrAction.FolderTag.Value}}</p>
            <p>Primary Table: {{dbrAction.PrimaryTable}}</p>
            <p>Special Use: {{dbrAction.SpecialUse}}</p>
            <mat-form-field>
              <mat-label>Name</mat-label>
              <input matInput formControlName="ActionName">
            </mat-form-field>
            <mat-form-field>
              <mat-label>Keywords</mat-label>
              <input matInput formControlName="Keywords">
            </mat-form-field>
            <mat-form-field>
              <mat-label>Description</mat-label>
              <input matInput formControlName="Description">
            </mat-form-field>
            <mat-form-field>
              <mat-label>Icon</mat-label>
              <mat-select formControlName="Icon" ngDefaultControl>
                <mat-option formControlName="Icon"
                  ngDefaultControl>
                  {{dbrAction.Icon}}
                </mat-option>
              </mat-select>
            </mat-form-field>
            <mat-form-field>
              <mat-label>Priority</mat-label>
              <input matInput formControlName="Priority">
            </mat-form-field>
            <mat-form-field>
              <mat-label>Title Font Size</mat-label>
              <mat-select formControlName="TitleFontSize" [value]="dbrAction.TitleFontSize" ngDefaultControl>
                <mat-option formControlName="TitleFontSize" [value]="dbrAction.TitleFontSize" ngDefaultControl>
                  {{dbrAction.TitleFontSize}}
                </mat-option>
              </mat-select>
            </mat-form-field>
            <mat-form-field>
              <mat-label>Subtitle Font Size</mat-label>
              <mat-select formControlName="SubtitleFontSize" [value]="dbrAction.SubtitleFontSize" ngDefaultControl>
                <mat-option formControlName="SubtitleFontSize" [value]="dbrAction.SubtitleFontSize" ngDefaultControl>
                  {{dbrAction.SubtitleFontSize}}
                </mat-option>
              </mat-select>
            </mat-form-field>
            <mat-form-field>
              <mat-label>Print Title Font Size</mat-label>
              <mat-select formControlName="PrintTitleSize" [value]="dbrAction.PrintTitleSize" ngDefaultControl>
                <mat-option formControlName="PrintTitleSize" [value]="dbrAction.PrintTitleSize" ngDefaultControl>
                  {{dbrAction.PrintTitleSize}}
                </mat-option>
              </mat-select>
            </mat-form-field>
            <mat-form-field>
              <mat-label>Print Subtitle Font Size</mat-label>
              <mat-select formControlName="PrintSubtitleSize" [value]="dbrAction.PrintSubtitleSize" ngDefaultControl>
                <mat-option formControlName="PrintSubtitleSize" [value]="dbrAction.PrintSubtitleSize" ngDefaultControl>
                  {{dbrAction.PrintSubtitleSize}}
                </mat-option>
              </mat-select>
            </mat-form-field>
            <!-- <mat-form-field>
              <mat-checkbox matInput formControlName="IsActive" [(ngModel)]="dbrAction.IsActive" [value]="dbrAction.IsActive" [labelPosition]="labelPosition">Is Active: </mat-checkbox>
            </mat-form-field> -->
          </div>
        </div>
      </form>

modify-view-action.component.ts

    import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormControl } from '@angular/forms';

@Component({
  selector: 'modify-view-action',
  templateUrl: './modify-view-action.component.html',
  styleUrls: ['./modify-view-action.component.scss']
})
export class ModifyViewActionComponent implements OnInit {
  objectData: any;

  constructor(private fb: FormBuilder) { }

  dbrAction: any;
  labelPosition: 'before' | 'after' = 'before';
  modifyActionForm: FormGroup;

  ngOnInit() {
    this.initData();
    this.modifyActionForm = this.fb.group({
    FolderTag: new FormControl(this.dbrAction.FolderTag),
    PrimaryTable: new FormControl(this.dbrAction.PrimaryTable),
    SpecialUse: new FormControl(this.dbrAction.SpecialUse),
    ActionName: new FormControl(this.dbrAction.ActionName),
    Keywords: new FormControl(this.dbrAction.Keywords),
    Description: new FormControl(this.dbrAction.Description),
    Icon: new FormControl(this.dbrAction.Icon),
    Priority: new FormControl(this.dbrAction.Priority),
    TitleFontSize: new FormControl(this.dbrAction.TitleFontSize),
    SubtitleFontSize: new FormControl(this.dbrAction.SubtitleFontSize),
    PrintTitleSize: new FormControl(this.dbrAction.PrintTitleSize),
    PrintSubtitleSize: new FormControl(this.dbrAction.PrintSubtitleSize),
    IsActive: new FormControl(this.dbrAction.IsActive)
    });

    this.objectData = this.modifyActionForm.value;
    console.log(this.objectData);
  }

  get f() { return this.modifyActionForm.controls; }


initData() {
    this.dbrAction = JSON.parse(localStorage.getItem('DbrAction'));
  }
}

【问题讨论】:

  • 为什么要在 input 元素上使用 value 属性?
  • 抱歉删除了,这并没有解决问题仍然有同样的问题@Chellappanவ
  • 你必须使用 setValue 或 patchValue 方法来设置表单 dyanmicalys angular.io/api/forms/FormControl#setvalue的值
  • 我仍然被困在这里如何使用它
  • 你试过@Soukyone 回答吗?

标签: javascript angular typescript angular7 angular-reactive-forms


【解决方案1】:

我看到您的 formControls 与 dbrAction 属性具有相同的名称,因此您可以使用 FormBuilder: https://angular.io/api/forms/FormBuilder

this.modifyActionForm = this.formBuilder.group(this.dbAction);

这将创建一个 formGroup,其中包含 dbrAction 的属性和值(一种使用对象创建 formGroup 的快速方法)。

如果您手动创建 FormGroup(如您所做的那样),您可以使用 patchValue 函数将值放入每个 FormControl:

  this.modifyActionForm.patchValue({
     FolderTag: this.dbrAction.FolderTag,
     PrimaryTable: this.dbrAction.PrimaryTable,
     SpecialUse: this.dbrAction.SpecialUse,
     ActionName: this.dbrAction.ActionName
     ....
  })

希望对你有帮助

【讨论】:

  • 这绝对有帮助...我应该把这个补丁值函数放在哪里?在 ngOnInit 之后?
  • 我有点晚了,抱歉,但最好的方法是执行补丁功能,一旦创建了 formGroup 并且您的 dbrAction 成功初始化。
【解决方案2】:

试试这个,希望对你有帮助。

ngOnInit() {
    this.initData();
    this.modifyActionForm = this.fb.group({
    FolderTag: [this.dbrAction.FolderTag],
    PrimaryTable: [this.dbrAction.PrimaryTable],
    SpecialUse: [this.dbrAction.SpecialUse],
    ActionName:[this.dbrAction.ActionName],
    Keywords: [this.dbrAction.Keywords],
    Description: [this.dbrAction.Description],
    Icon: [this.dbrAction.Icon],
    Priority: [this.dbrAction.Priority],
    TitleFontSize: [this.dbrAction.TitleFontSize],
    SubtitleFontSize: [this.dbrAction.SubtitleFontSize],
    PrintTitleSize: [this.dbrAction.PrintTitleSize],
    PrintSubtitleSize: [this.dbrAction.PrintSubtitleSize],
    IsActive: [this.dbrAction.IsActive]
    });

    this.objectData = this.modifyActionForm.value;
    console.log(this.objectData);
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2021-06-30
    • 2020-01-01
    • 1970-01-01
    • 2019-04-06
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多