【问题标题】:cascading dropdown in dynamic row angular?动态行角度的级联下拉菜单?
【发布时间】:2021-07-24 08:45:19
【问题描述】:

我有单独工作的级联下拉列表,但是当我生成新行并更改其中一个下拉列表时,它会影响我的整个下拉列表。

这是我的 html 代码。

    <td>       
       <select class="form-control" formControlName="province_id" 
           (change)="onChangeProvince($event)">
          <option >Select Province</option>
          <option *ngFor="let province of provinces; let i = index" 
              [value]="province.id">{{province.province_name}}</option>
       </select>
    </td>
    <td>
       <select  class="form-control" formControlName="district_id">
          <option >Select District</option>
          <option *ngFor="let district of districts" [value]="district.id">
               {{district.district_name}}</option>
       </select>
    </td>
    <td>
       <button class="btn btn-danger"  type="button" 
           (click)="deleteMyRelation(i)">Delete</button>
       <button class="btn btn-primary" type="button" 
           (click)="addItem()">Add</button>
    </td>

这是我的组件代码。

      createItem(): FormGroup {
            return this.fb.group({
              province_id: '',
              district_id: ''
            });
          }
        
       addItem(): void {
            this.itemRows = this.contactForm.get('itemRows') as FormArray;
            this.itemRows.push(this.createItem());
          }

       ngOnInit() {
            this.contactForm = this.fb.group({
              province_id: '',
              district_id: '',
              itemRows: this.fb.array([ this.createItem() ])
            });
            this.getProvinces();
          }

          provinces = <any>[];
          districts = <any>[];

          getProvinces(){
            this.contactService.getProvinces().subscribe(
              data => {
                this.provinces = data;
                console.log(data);
              },
              error => {
                console.log(error);
              });
          }
          onChangeProvince(event:any){
            
            this.contactService.getDistrict(event.target.value).subscribe(
              data => {
                this.districts = data;
              },
              error => {
                console.log(error);
              });
          }

【问题讨论】:

    标签: angular cascadingdropdown formarray cascading


    【解决方案1】:

    您需要使用[formGroupName]='i' 定义每个控件。现在 Angular 将正确地为每个组分配值,例如

    <table [formGroup]='contactForm'>
      <ng-container formArrayName='itemRows'>
        <tr *ngFor="let itemRow of itemRows.controls; let i = index" [formGroupName]='i'>
          <td>
            <select class="form-control" formControlName="province_id"
               (change)="onChangeProvince(i)">
              <option  value=''>Select Province</option>
              <option *ngFor="let province of provinces; let i = index" 
                  [value]="province.id">{{province.province_name}}</option>
           </select>
          </td>
          <td>
            <select  class="form-control" formControlName="district_id">
              <option value=''>Select District</option>
              <option *ngFor="let district of districts[i]" [value]="district.id">
                   {{district.district_name}}</option>
           </select>
          </td>
          <td>
            <button class="btn btn-danger"  type="button"
               (click)="deleteMyRelation(i)">Delete</button>
            <button class="btn btn-primary" type="button"
               (click)="addItem()">Add</button>
          </td>
        </tr>
      </ng-container>
    </table>
    

    我们现在可以定义以下函数来添加和删除项目

      get itemRows() {
        return this.contactForm.get("itemRows") as FormArray;
      }
      deleteMyRelation(i) {
        this.itemRows.removeAt(i)
      }
      addItem(): void {
        this.itemRows.push(this.createItem());
      }
      onChangeProvince(i) {
        this.contactService
          .getDistrict(this.itemRows.get(i + ".province_id").value)
          .subscribe(
            data => {
              this.districts[i] = data;
            },
            error => {
              console.log(error);
            }
          );
      }
    

    现在您的表单应该可以正常工作了

    See Demo

    【讨论】:

    • 我的province_id是dictionary表中的外键,必须根据province_id加载dictionary。
    • 我提供的是模拟服务。由于您提供的信息很少,几乎不可能为您提供帮助。你能分享一个 stackblitz 演示吗?
    • 谢谢您,您的信息非常好,我的代码完全可以工作,但问题是我有两个表省和区,省 id 是区表中的外键,当我更改时下拉列表的最后一个省份 我的所有地区下拉列表由最后一个与省份相关的地区填充。
    • 您能分享您的服务代码吗?尤其是getProvincegetDistrict 函数
    • getProvinces() { return this.http.get(this.apiURL+ '/api/provinces/'); } getDistrict(province_id:any) { return this.http.get(this.apiURL+ '/api/district/' + Province_id); }
    【解决方案2】:

    补充答案,当我们在订阅中唯一需要使用 .html 中的值时,您可以使用管道异步。

    你定义

    //It's usually way, named a variable that was an observable adding a "$" to the variable
    province$=this.contactService.getProvinces()
    district$=[]
    

    和往常一样,我们有一个 formArray 好有一个 getter

      get array(){
         return this.contactForm.get('itemRows') as FormArray;  
      }
    

    你的(改变)变得像

      change(index)
      {
        const value=+(this.array.at(index) as FormGroup).get('province_id').value;
        this.array.at(index).get('district_id').setValue(null)
        this.district$[index]=this.dataService.getDistrict(value)
      }
    

    你可以使用

       <select class="form-control" formControlName="province_id"
                      (change)="change(index)"  >
           <!--see that in selectProvince we put [value]="null" and hidden-->
          <option [value]="null" hidden>Select Province</option>
          <option *ngFor="let province of province$|async; let i = index" 
              [value]="province.id">{{province.province_name}}</option>
       </select>
       <select  class="form-control" formControlName="district_id">
          <option [value]="null" hidden>Select District</option>
          <option *ngFor="let district of district$[index]|async"
               [value]="district.id">
               {{district.district_name}}</option>
       </select>
    

    我在this stackblitz写了一个傻瓜例子(没有你的模型,但希望能帮助启发)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2021-08-11
      • 2011-03-03
      • 2022-11-25
      相关资源
      最近更新 更多