微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 ngFor 循环中使用 ngModel

如何解决在 ngFor 循环中使用 ngModel

我在 ngModel 循环内使用 ngFor 从下拉菜单获取值,如下所示:

<div *ngFor="let group of groups">
  <select [(ngModel)]="selectedOption">
          <option *ngFor="let o of options">
            {{o.name}}
          </option>
        </select>
  <p>Selected option: {{ selectedOption }}</p>
<div>

当我从下拉列表中选择一个选项时,它会将所有其他下拉列表设置为相同的值。这是预期的行为,因为在 ngModel 循环创建的所有实例上,selectedOption 都绑定到 ngFor

我的问题是,在循环中解耦不同下拉列表以便它们独立运行的好方法是什么?

Stackblitz 是 here

解决方法

您将同一属性绑定到所有下拉列表。

如果你想用循环来做到这一点,那么你需要一个数组。 selectedOptions: string[] = []; 而不是 selectedOption: string;

打字稿部分也几乎不需要改动。

按照我在 Stackblitz 处解决问题的方法。

,

我更喜欢的方式是让它成为一个自己的组件:

<ng-container *ngFor="let group of groups">
   <app-group [group]=group [options]=options></app-group>
</ng-container>

组组件模板:

<select [(ngModel)]="selectedOption">
          <option *ngFor="let o of options">
            {{o.name}}
          </option>
        </select>
  <p>Selected option: {{ selectedOption }}</p>

GroupComponent TS 文件看起来有点像这样:

@Component({
...
})

@Input(): group: Group;
@Input(): options: any[]; // Whatever the data type of option is

selectedOption: any;
,

我认为您可以使用自定义类来解决您的问题。因为您可以为每个特定组声明一个 selectedOption。下面是我的代码。
请检查链接: Demo Link StackBlitz
HTML:

<div *ngFor="let group of mygroups">
  <select [(ngModel)]="group.selectedOption" (ngModelChange)="checkChange($event,group)">
          <option *ngFor="let o of options">
            {{o.name}}
          </option>
        </select>
  <p>Selected option: {{ group.selectedOption }}</p>
</div>

TS:自定义组类

export class MyGroup{
  id:number;
  name:string;
  selectedOption:any;
}

代码在您的 AppComponent =>

mygroups: MyGroup[] = [];

  options = [
    { name: "option1",value: 1 },{ name: "option2",value: 2 }
  ]
  constructor(){
    for(let i=1;i<=2;i++){
      let temp= new MyGroup();
      temp.id=i;
      temp.name='N-'+i;
      this.mygroups.push(temp);
    }
  }
  checkChange($event,grp){
    console.log("GRP:"+grp.name);
    console.log("Data:"+$event);
  }

注意:我在 stackblitz 中更改和更新了您代码中的一些内容。

,

一个简单的解决方案是将所选选项绑定到组,如下所示。

  1. 创建一个新界面:

    接口组{ 名称:字符串; selectedOption?: 字符串; }

  2. 将组的类型更改为组的数组:

    组:组[] = [{名称:“组1”},{名称:“组2”}];

  3. 更改 ngModel 绑定:

你可以找到我的解决方案here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。