【问题标题】:How to loop two array and compare it if same checkbox is checked Angular 2如果选中相同的复选框,如何循环两个数组并进行比较Angular 2
【发布时间】:2017-09-02 08:12:55
【问题描述】:

我有一个包含所有办公室列表的数组。另一个数组是用户选择的列表。所以现在我想显示所有 officelist,如果所选列表中的值与 office list 相同,则将选中该复选框。我就是这样做的。
代码

<div *ngFor="let item of officeLIST">
  <div *ngFor="let officeDATA of allOffice.office">
    <div *ngIf="item.office_id == officeDATA.office_id">
      <input #officeArray type="checkbox" id="officeArray" name="officeArray" class="form-control" value="{{item.officename}}"
        checked> {{(item.officename == "" ? "--No data--" : item.officename)}}
    </div>
    <div *ngIf="item.office_id != officeDATA.office_id">
      <input #officeArray type="checkbox" id="officeArray" name="officeArray" class="form-control" value="{{item.officename}}">      {{(item.officename == "" ? "--No data--" : item.officename)}}
    </div>
  </div>
</div>

结果是

我的办公室列表

this.officeLIST = [
  { "office_id": "1", "officename": "Sun Dept" },
  { "office_id": "2", "officename": "Moon" },
  { "office_id": "3", "officename": "Stars" }
]

allOffice.office 数组

"office": [
    {
      "office_id": "1",
      "officename": "Sun Dept"
    },
    {
      "office_id": "2",
      "officename": "Moon Dept"
    }
  ]

【问题讨论】:

  • 你能给我们看看officeLISTallOffice.office的数据吗,只要console.log(),如果console有任何错误,请在此处发布:)
  • 可能在您的 *ngIf 语句中有问题
  • @IsuruAb 看看我的更新问题
  • @parvezalamkhan 我找不到问题所在.. :(
  • 我在课堂上将办公室声明为字符串,我应该将其更改为数组吗?

标签: arrays angular typescript checkbox ngfor


【解决方案1】:

使用这个解决方案。这对我来说很好。我已经在构造函数中完成了所有的事情。如果你想在一个方法中这样做,只需使用构造函数中的代码块。

这是我的 ts 文件:

  officeLIST: Array<any> = [
    { "office_id": "1", "officename": "Sun Dept" },
    { "office_id": "2", "officename": "Moon" },
    { "office_id": "3", "officename": "Stars" }
  ];


  office: Array<any> = [
    {
      "office_id": "1",
      "officename": "Sun Dept"
    },
    {
      "office_id": "2",
      "officename": "Moon Dept"
    }
  ];
  newArray: Array<any> = [];
  constructor() {
    for (var i = 0; i < this.officeLIST.length; i++) {

      var ismatch = false; // we haven't found it yet

      for (var j = 0; j < this.office.length; j++) {

        if (this.officeLIST[i].office_id == this.office[j].office_id) {
          // we have found this.officeLIST[i]] in this.office, so we can stop searching
          ismatch = true;
          this.officeLIST[i].checked = true;//  checkbox status true
          this.newArray.push(this.officeLIST[i]);
          break;
        }//End if
        // if we never find this.officeLIST[i].office_id in this.office, the for loop will simply end,
        // and ismatch will remain false
      }
      // add this.officeLIST[i] to newArray only if we didn't find a match.
      if (!ismatch) {
        this.officeLIST[i].checked = false;//  checkbox status false
        this.newArray.push(this.officeLIST[i]);
      } //End if
    }
    console.log(this.newArray);

  }

这是我的html:

<div *ngFor="let item of newArray">
  <input type="checkbox" [checked]="item.checked"> {{item.officename}}
</div>

【讨论】:

  • @user3431310 :) 很高兴为您提供帮助。
【解决方案2】:

您的用户选择的数组将具有选定复选框的 ID。 假设他选择了太阳系和月亮,那么

this.userSelectedArray = ["1","2"];

<div *ngFor="let item of officeLIST">
      <input type="checkbox" [attr.checked]="userSelectedArray.indexOf(item.office_id) !== -1 ? true : false">
    </div>

【讨论】:

  • 嗨,我所有的复选框都被选中了..忘了提。 selected 数组实际上是用户选择的默认值。 officeArray 是显示所有内容的主数组。因此,如果用户使用 officeArray 选择了 sam,则会选中该复选框。否则它不会
  • 表示它将迭代 officeArray(共 3 个数据)。视图将显示所有这些。假设用户只选择了 2 个数据,所以该复选框将只被选中 2,其余一个未被选中
  • 所以当用户更改复选框的状态时,它的 id 将被推送到 selectedArray 然后你可以使用我的 ans 中的代码。
  • 为什么它不适合你。它对我有用。
  • 接受的代码也是如此。仅显示加载的小提琴不是因为我的代码,而是因为一些 ngfor 问题。打开控制台看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2017-05-17
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
相关资源
最近更新 更多