【问题标题】:Multiple select tag using *ngfor Changing first select tag value affects other select tag使用 *ngfor 的多个选择标签更改第一个选择标签值会影响其他选择标签
【发布时间】:2020-02-19 16:45:03
【问题描述】:

      <table id="DataTable" border="1" ALIGN="center">
    	<tr ALIGN="center">
    		<th>name</th>
    		<th>address</th>
    		<th>number</th>
    		<th>type</th>
    	</tr>
    	<tr class="tcat" *ngFor="let item of Tdata;  let i = index;">
    		<td class="name">{{item.name}}</td>
    		<td class="address">{{item.address}}</td>
    		<td class="number">{{item.number}}</td>
    		<td class="type" ALIGN="center"
    			*ngIf="!item.type || item.type == null || item.type == 'undefined'">
    			<select (click)="jsFunction();">
             <option value="" disabled selected>Select your option</option>
            <option *ngFor="let currentData of dropdata"> 
              {{currentData.type}}</option>
          </select>
    		</td>
    	</tr>
    </table>`

.ts 文件

    dropdata:any;
  Tdata = [
    { name: "xyz", address: "abc", number: 12345, type: null },
    { name: "xyz1", address: "abc1", number: 78900, type: null },
    { name: "xyz2", address: "abc2", number: 7400, type: null }
  ];
  selecttedDropData = {};

  jsFunction() {
    // called second api;
    this.dropdata = [
      { number: "12345", type: "customer" },
      { number: "12345", type: "dealer" },
      { number: "12345", type: "client" },
      { number: "12345", type: "master" }
    ];

  }
  1. 在页面加载时,我显示了一个表格,并在列类型中添加了 一个下拉菜单。

  2. 点击每个下拉菜单时,我会调用 API 并获取要填充的数据选项。

  3. 唯一的问题是当我单击第一个下拉菜单或任何其他下拉菜单并选择任何选项之后,我选择第二个或任何其他下拉菜单,因此所有选定的下拉列表值都会更改等等。

找不到任何有用且正确的答案。请帮帮我。

非常感谢。

【问题讨论】:

  • 当您更改选项时,是否需要通过获取的数据影响已选择的下拉菜单?
  • 第二个api获取不同的值,对吧?
  • 点击时的每个下拉菜单都有一个 API 调用。第二个 API 每次都获取不同的值。表格中有多个下拉列表,当我选择一个下拉列表时,所有选定的下拉列表都会更改
  • 如果我的回答对您有帮助,请点赞并点击勾选以帮助寻求此类问题的人

标签: javascript html arrays angular datatable


【解决方案1】:

您对绑定数据使用相同的引用。

一种解决方案可能是将 dropData 声明为一个大小与您的数组大小相同的数组。

this.dropData = new Array(this.Tdata.length);

然后使用相应的表格获取值。您需要使用类似这样的内容(包含在 stackblitz 中)对每个进行克隆。在这种情况下,我选择了带有扩展运算符的浅拷贝[...this.data]

 jsFunction(event, i) {
    if (this.dropdata[i] == null || this.dropdata[i].length < 1) {
      this.dropdata[i] = [...this.data];
    }
  } 

然后在html中

*ngFor="let currentData of this.dropData[index]"

Demo Here - StackOverflow

我给你的建议是你使用像材料选择这样的东西。您会注意到,如果您删除 (this.dropdata[i] || 数据),则需要在下拉列表上单击三次才能打开。这是因为在选择打开时添加选项非常困难。因此,第一次单击将其打开为空,第二次单击将其关闭,第三次单击将其与新数据一起打开。

这是另一个可以解决的问题,但我认为它不在问题的范围内。

你会不断碰到这些。 material select 等其他人已经解决了这些问题。

【讨论】:

  • 你能分享一个演示吗?
  • 可以,只是现在不行,因为我没有可用的电脑
  • 感谢您的指导。所以现在我正在使用 mat-table 和下拉 mat-select 但问题是当我选择 1st 或任何其他下拉列表时,我正在调用 API 并获取我在选项中显示的值,例如 1、2、3,然后我选择2.注意每个下拉选项数据是不同的。因此,如果我单击第二个或任何其他下拉菜单,调用相同的 API,但获取值可能会更改,例如 4、5、6,因此当 4、5、6 加载选项时,第一个下拉菜单选择的值更改为 5。同样如此到其他下拉菜单。我的事情是因为所有下拉列表的 this.dropData 范围相同
  • 您是否按照演示指南进行操作?我为每个下拉列表和不同的选定值使用不同的值数组。
  • 是的,它可以工作,但会出现另一个问题。在 mat-table 中,如果我选择下拉值并跳转到下一页,我的意思是使用分页并再次来到该页面,选定的下拉值不会留在该下拉列表中。
【解决方案2】:

定义一个数组来存储第二个 api 调用 selectedData=[];。其实我做了一个小技巧。由于我们无法区分&lt;select&gt;&lt;option&gt;,因此点击时标记。我使用变量open 来了解选择下拉菜单是否打开。

<select (blur)="closeSelect()" (click)="jsFunction(i);">
    <option value="" disabled selected>Select your option</option>
    <option [value]="currentData.type" *ngFor="let currentData of selectedData[i]">{{currentData.type}}</option>
</select>

如果它打开并被点击,我们可以将它添加到具有相应索引的数组中。

jsFunction(i){
    // telling open = false / true
    this.open=!this.open;
    // called second api;
    let data=[
        {number: "1",
        type: "customer"},
        {number: "2",
        type: "dealer"},
        {number: "3",
        type: "client"},
        {number: "4",
        type: "master"},
    ]
    if(this.open)
        this.selectedData[i]=data;
}

当您点击值或(blur) 外部时,我们会生成open = false

closeSelect(){
  this.open=false
}

由于没有其他答案有效,这可以解决您的问题。我也搜索过,但没有运气。我会努力优化的。

工作Stackblitz

【讨论】:

  • 请注意 let data 中的值会随着每个下拉列表而改变。因此,例如,如果我单击第一个下拉列表,我将从 API 获取 1、2、3 数据并选择 2,然后,如果我选择第二个或任何其他下拉列表,我将获得不同的数据,例如 4、5、6所以第一个下拉选择的值更改为 5,因为让数据值的范围发生了变化。
【解决方案3】:

试试这样:

selecttedDropData = {};


  jsFunction(num) {
    // called second api;
    let dropData = [
      { number: "12345", type: "customer" },
      { number: "12345", type: "dealer" },
      { number: "12345", type: "client" },
      { number: "12345", type: "master" }
    ];
    this.selecttedDropData[num] = dropData;
  }

模板:

<option [value]="currentData.type" *ngFor="let currentData of selecttedDropData[item.name]"> 
        {{currentData.type}}
</option>

Demo

【讨论】:

  • 在演示中。在所有下拉列表中只选择一个选项
  • 请注意 let dropData 中的值会随着每个下拉菜单而改变。因此,例如,如果我单击第一个下拉列表,我将从 API 获取 1、2、3 数据并选择 2,然后,如果我选择第二个或任何其他下拉列表,我将获得不同的数据,例如 4、5、6所以第一个下拉选择值更改为 5,因为 let dropData 值的范围发生了变化。
猜你喜欢
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2017-05-04
  • 2012-01-18
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多