如何在Angular反应式表单数组中制作级联下拉菜单,而不会搞乱下拉菜单的值

12

我在angular 4中有一个表单,包含名字和姓氏以及一个包含两个下拉框(select)的formarray,作为级联下拉框,还有一个删除按钮。表单的其余部分也包含发送按钮和添加选项按钮。我在下面添加了一张截图,以便您更好地理解。表单的添加、删除和发送按钮都可以正常工作,但是有一个问题,当我添加额外的级联下拉选择时,级联下拉选择仅在有1个级联下拉选择时起作用。当我添加第二个级联下拉选择时,前面级联下拉选择组的值会混乱。我在下面添加了图片进行更好的说明。

enter image description here

正如您在第2张和第3张图片上所看到的那样,级联下拉选择正在工作。 当我在Criteria中更改选择时,我得到了正确的选项以在第2个下拉列表中选择

enter image description here

enter image description here

enter image description here

在第4张图片,第5张图片和第6张图片中,您可以看到添加选项按钮可以正常工作,但是当我在Option 2的第一个下拉列表中选择Criteria时,它会与Option 1的第二个Dropwown混乱,现在它包含来自第二个Option的下拉选项

enter image description here

enter image description here

这是我的HTML代码:

<form [formGroup] = "profileForm">

  <h1>Profile Form</h1>

 <div>
  <label for = "first-name-input">First Name</label>
  <input type="text" id="first-name-input" formControlName ="firstNameInput">
</div>
 <div>
    <label for = "last-name-input">Last Name</label>
    <input type="text" id="last-name-input" formControlName ="lastNameInput">
  </div>

  <div formArrayName="optionGroups">

    <div *ngFor="let optionGroup of profileForm.controls['optionGroups'].controls;  let i=index "[formGroup]="optionGroup">


      <h4>Option {{ i + 1 }} </h4>




     <div>
      <label for = "select-input">Criteria</label>
      <select id="select-input" (change)="onSelectSelect($event.target.value, i)"  formControlName ="selectInput">

          <option value="0" disabled selected>Select a Criteria</option>
          <option *ngFor="let select of selects"  [value]= "select.name">{{select.id}}</option>


        </select>

        <label for = "where-input">Option</label>
        <select id="where-input" formControlName ="whereInput">
  
            <option value="0" disabled selected>Select a Option</option>
            <option *ngFor="let where of wheres" value= {{where.name}}>{{where.id}}</option>


          </select>

          <button type ="button" (click)="removeOptionGroup(i)">X</button>

         


     </div>

    </div>

   </div>
   <button type ="button" (click)="addOptionGroup()">Add Options</button>
   <div>

    <button type ="button" (click)="saveProfileForm()">Send </button>

   

   </div>

</form>

这是我的组件文件

export class PowComponent {

 selects: Select[];
 wheres: Where[];


 public profileForm : FormGroup;

 public addOptionGroup(){

 const fa = this.profileForm.controls["optionGroups"] as FormArray;

  fa.push(this.newOptionGroup());

  }

  public removeOptionGroup(index: number){

   const fa = this.profileForm.controls["optionGroups"] as FormArray;

    fa.removeAt(index);

   }


   public saveProfileForm(){

    console.log(this.profileForm.value);
   }



   constructor(public router: Router,  public dropdownqueryservice:    DropDownQueryService , private fb : FormBuilder) {
    this.profileForm = this.fb.group({

        firstNameInput : [ "" ],
        lastNameInput : [ "" ],
        optionGroups : this.fb.array([
            this.fb.group({

              selectInput : [ "" ],
              whereInput : [ "" ],

          }),
       ]),
    });

    this.selects = this.dropdownqueryservice.getSelect();
    this.wheres=[];

}

onSelectSelect(selectid, i) {
    this.wheres = this.dropdownqueryservice.getWhere().filter((item)=> item.selectid == selectid);

  }


 private newOptionGroup() {
  return new FormGroup({

      selectInput: new FormControl(""),
      whereInput: new FormControl(""),

  });
   }

  }

尝试使用ngValue而不是value,请参见:https://dev59.com/AFsX5IYBdhLWcg3whv7Q#37313787 - Rusty Rob
我尝试使用ngValue,但是出现了更多错误。 - user3277530
1
您面临此问题是因为您只有一个 selects 参数,但却有两个不同的选择值。您需要处理多个选择数组,并为每个多选输入提供可能的选择值。 - ibenjelloun
1个回答

7

如我之前在评论中提到的那样,问题出在用于多选表单的唯一selects数组上。

您需要创建一个Select数组的数组,其中包含每个选择值的可能条件的数组。

这里是一个StackBlitz的解决方案建议,我进行了一些修改以使其简单并能够工作。如果您想更明确地了解您的关注点,请随意分叉和编辑。


嗨,我很忙。我看了你的代码,但是因为我的代码有一个数组,所以我可能需要想办法解决一下。由于赏金即将到期,我决定把它给你了。今天晚些时候或明天,我会 fork 你的代码并在这里发布。我已经完成了一半。谢谢。 - user3277530
我尝试了你的代码,但是我觉得由于我使用了一个对象数组,所以这里有所不同,这是我的代码 https://stackblitz.com/edit/stackoverflow-49722349-6pvgkh - user3277530
这是您的 StackBlitz 的修复版本,其中包含建议的解决方案:https://stackblitz.com/edit/stackoverflow-49722349-2 - ibenjelloun
1
感谢提供示例解决方案!我的一个问题是,当您更改第一个下拉列表时,第二个下拉列表保留旧值,这个值已经无效了。清除第二个下拉框的最佳方法是什么?在我的情况下,我使用级联下拉列表逐步过滤。所以 - 如果旧值仍然有效 - 请保留它,如果不是 - 请清除它。 - Nick Goloborodko
@NickGoloborodko 这是一个有趣的评论,我没有注意到。我还不知道如何正确处理它,你能否为这个问题创建一个新的问题? - ibenjelloun
@ibenjelloun,你好,我对Angular还比较新,正在研究你的解决方案。这个方案非常棒,但我想知道是否有办法添加文件上传选项。例如,当用户从下拉菜单中选择“位置”时,它将显示文件上传而不是另一个下拉菜单!此外,我希望在输出中显示文件内容! - Paul85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接