【问题标题】:Nested FormGroup in FormArray repeating all radio button values - Angular (UI with PrimeNG)FormArray 中的嵌套 FormGroup 重复所有单选按钮值 - Angular(带有 PrimeNG 的 UI)
【发布时间】:2021-09-18 19:52:11
【问题描述】:

Stackblitz

我正在处理带有单选按钮输入的表单(使用 PrimeNg ui,但这与手头的问题无关紧要),其中每个单选按钮组都由 API 填充到表单组中。在我的AppComponent 中,我正在填充数据,这就是来自 API 的方式(示例的静态数据):

ngOnInit() {
    this.settingsByCategory = [
      {
        categoryName: 'None',
        permissions: [
          {
            id: 1,
            name: 'Test Category 1'
          },
          {
            id: 2,
            name: 'Test Category 2'
          },
          {
            id: 9,
            name: 'Test Category 3'
          }
        ]
      }
    ];

    this.settingForm = this.fb.group({
      settings: this.fb.array([])
    });

    this.setForm();
  }

  setForm() {
    this.settingsByCategory.forEach(i => {
      i.permissions.forEach(p => {
        (this.settingForm.get('settings') as FormArray).push(
          this.fb.group({
            settingId: p.id,
            settingName: p.name,
            permission1: null,
            permission2: null,
            permission3: null
          })
        );
      });
    });
  }

问题是,当我选择一个单选按钮时,会选择所有组,而不是只选择一个组。

在我的 HTML 中,我使用 FormGroup、FormArrayName 和 FormControls 的嵌套分组来填充适当的数据。这有点乱,但我首先尝试解决这个问题:

<ng-container>
  <div>
    <form [formGroup]="settingForm">
      <div formArrayName="settings" class="perm-grid">
        <div *ngFor="let setting of settings.controls; index as i">
          <div [formGroupName]="i">
            <h2 style="border-bottom: 1px solid #495057; padding-left: 5px">{{ setting.value.settingName }}</h2>
            <ul class="perm-list">
              <li class="radio-grid">
                <div class="radio-grid-row">
                  <div style="margin-left: 5px"></div>
                  <div>Company</div>
                  <div>Area</div>
                  <div>Location</div>
                </div>
                <div class="radio-grid-row">
                  <div style="margin-left: 5px">None</div>
                  <div>
                    <p-radioButton (onClick)="logRadio($event, setting)" name="permission1"
                      formControlName="permission1" [value]=0>
                    </p-radioButton>
                  </div>
                  <div>
                    <p-radioButton (onClick)="logRadio($event, setting)" name="permission2"
                      formControlName="permission2" [value]=0>
                    </p-radioButton>
                  </div>
                  <div>
                    <p-radioButton (onClick)="logRadio($event, setting)" name="permission3"
                      formControlName="permission3" [value]=0>
                    </p-radioButton>
                  </div>
                </div>
                <div class="radio-grid-row">
                  <div style="margin-left: 5px">View</div>
                  <div>
                    <p-radioButton (onClick)="logRadio($event, setting)" name="permission1"
                      formControlName="permission1" [value]=1>
                    </p-radioButton>
                  </div>
                  <div>
                    <p-radioButton (onClick)="logRadio($event, setting)" name="permission2"
                      formControlName="permission2" [value]=1>
                    </p-radioButton>
                  </div>
                  <div>
                    <p-radioButton (onClick)="logRadio($event, setting)" name="permission3"
                      formControlName="permission3" [value]=1>
                    </p-radioButton>
                  </div>
                </div>
                <div class="radio-grid-row">
                  <div style="margin-left: 5px">Edit</div>
                  <div>
                    <p-radioButton (onClick)="logRadio($event, setting)" name="permission1"
                      formControlName="permission1" [value]=2>
                    </p-radioButton>
                  </div>
                  <div>
                    <p-radioButton (onClick)="logRadio($event, setting)" name="permission2"
                      formControlName="permission2" [value]=2>
                    </p-radioButton>
                  </div>
                  <div>
                    <p-radioButton (onClick)="logRadio($event, setting)" name="permission3"
                      formControlName="permission3" [value]=2>
                    </p-radioButton>
                  </div>
                </div>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </form>
  </div>
</ng-container>

对于标准输入,我使用了这种方法,并且效果很好。为什么所有单选按钮表单控件都在组间重复?

Stackblitz

【问题讨论】:

    标签: javascript angular typescript primeng angular-forms


    【解决方案1】:

    发生这种情况是因为单选按钮组的name 对于所有类别都是相同的,因此它们都相互连接。

    您可以通过以下方式解决此问题:

    • 为组名添加后缀/前缀以将它们相互区分,例如您可以添加索引i,例如name="permission1-{{i}}",因此稍后将解决为name="permission1-0" 用于类别1 和name="permission1-1" 用于类别2...等等。
    • 上述更改会导致与使用的primeNG版本相关的另一个问题,即:If you define both a name and a formControlName attribute on your radio button, their values must match,要解决此问题,您可以使用formControl而不是formControlName,例如:[formControl]="settingForm?.get('settings').controls[i].get('permission1')"

    所以组件模板的单选按钮部分将如下所示:

    <div class="radio-grid-row">
      <div style="margin-left: 5px">None</div>
      <div>
        <p-radioButton (onClick)="logRadio($event, setting)" name="permission1-{{i}}"
          [formControl]="settingForm?.get('settings').controls[i].get('permission1')" [value]="0">
        </p-radioButton>
      </div>
      <div>
        <p-radioButton (onClick)="logRadio($event, setting)" name="permission2-{{i}}"
          [formControl]="settingForm?.get('settings').controls[i].get('permission2')" [value]="0">
        </p-radioButton>
      </div>
      <div>
        <p-radioButton (onClick)="logRadio($event, setting)" name="permission3-{{i}}"
          [formControl]="settingForm?.get('settings').controls[i].get('permission3')" [value]="0">
        </p-radioButton>
      </div>
    </div>
    <div class="radio-grid-row">
      <div style="margin-left: 5px">View</div>
      <div>
        <p-radioButton (onClick)="logRadio($event, setting)" name="permission1-{{i}}"
          [formControl]="settingForm?.get('settings').controls[i].get('permission1')" [value]="1">
        </p-radioButton>
    
      </div>
      <div>
        <p-radioButton (onClick)="logRadio($event, setting)" name="permission2-{{i}}"
          [formControl]="settingForm?.get('settings').controls[i].get('permission2')" [value]="1">
        </p-radioButton>
      </div>
      <div>
        <p-radioButton (onClick)="logRadio($event, setting)" name="permission3-{{i}}"
          [formControl]="settingForm?.get('settings').controls[i].get('permission3')" [value]="1">
        </p-radioButton>
      </div>
    </div>
    <div class="radio-grid-row">
      <div style="margin-left: 5px">Edit</div>
      <div>
        <p-radioButton (onClick)="logRadio($event, setting)" name="permission1-{{i}}"
          [formControl]="settingForm?.get('settings').controls[i].get('permission1')" [value]="2">
        </p-radioButton>
      </div>
      <div>
        <p-radioButton (onClick)="logRadio($event, setting)" name="permission2-{{i}}"
          [formControl]="settingForm?.get('settings').controls[i].get('permission2')" [value]="2">
        </p-radioButton>
      </div>
      <div>
        <p-radioButton (onClick)="logRadio($event, setting)" name="permission3-{{i}}"
          [formControl]="settingForm?.get('settings').controls[i].get('permission3')" [value]="2">
        </p-radioButton>
      </div>
    </div>
    

    这是您的 stackbiltz 的编辑版本: https://stackblitz.com/edit/primeng-dynamicdialog-demo-25iydv

    【讨论】:

      猜你喜欢
      • 2018-06-23
      • 2021-07-07
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 2019-04-21
      • 1970-01-01
      相关资源
      最近更新 更多