如何从子数组中选择特定的一个

时间:2019-05-05 15:21:26

标签: javascript angular typescript ionic3

当我选择第一个的第一个父级孩子数组时,它正在选择其他所有父级孩子。我知道这是因为索引0对所有人仍然相同。我如何从孩子中选择特定的一个并突出显示它。

链接: stackblitz playground

我曾尝试比较父级和子级的索引,但是即使这样我也无法选择子级数组中的特定子项。

home.html

<style>
  .highlight {
    background-color:#777;
  }
</style>

<ion-item *ngFor="let date of testList"> 
    {{date.date}} 
    <ion-item *ngFor="let item of date.item; let i= index" [class.highlight]="i == selectedOne" (tap)="onSelected(i)">
           {{item.name}}
    </ion-item>
  </ion-item>

home.ts

  public testList: any[] = [
    {
      date: 'test1',
      item: [ {
        name:'tony',
        id:23
      },
       {
         name:'shawn',
         id:12
       },
       {
         name:'rancho',
         id:33
       }
      ]
    },
{
      date: 'test2',
      item: [ {
        name:'Monty',
        id:345
      },
       {
         name:'Bob',
         id:321
       },
       {
         name:'Dexter',
         id:324
       }
      ]
    },
    {
      date: 'test3',
      item: [ {
        name:'Trillo',
        id:234
      },
       {
         name:'Stenly',
         id:12
       },
       {
         name:'Destro',
         id:123
       }
      ]
    }
  ]

  public selectedOne: boolean 
  onSelected(index) {
     if (this.selectedOne != index) {
          this.selectedOne = index;
        } else {
          this.selectedOne = null;
        }
  }

我想选择一个特定的并突出显示。enter image description here

3 个答案:

答案 0 :(得分:3)

我将首先向列表中显示的每个项目添加一个选定的属性,尽管我将其移至ngOnInit(),也可以使用以下所有属性来完成此操作。

 constructor(public navCtrl: NavController) {
     this.testList.forEach(data => data.item.forEach(each => 
        {
          each.selected = false;
        })
     )
  }

这意味着您可以针对每个对象存储对象,无论是否已选择它。然后将您的html修改为如下所示。更改是,单击时将通过项目及其父项而不是索引,并且[class.highlight]会检查selectedtrue还是false

<ion-content padding>
  <ion-item *ngFor="let date of testList"> 
    {{date.date}} 
    <ion-item *ngFor="let item of date.item; let i= index" 
        [class.highlight]="item.selected" (tap)="onSelected(item, date)">
           {{item.name}}
    </ion-item>
  </ion-item>
</ion-content>

并对点击时调用的函数进行一些改动,如果selected中包含false,则将其设置为true,反之亦然。

修改

定义清除功能以清除所有内容,就像迭代到所有位均为假的第一位一样。


onSelected(item, parent)
{ 
    this.testList.forEach(data => data.item.forEach(each =>
        { each.selected = false; }));

    item.selected ? item.selected = false : item.selected = true;
}

答案 1 :(得分:1)

  

检查 WORKING STACKBLITZ

您的home.html如下所示:〜

<ion-header>
    <ion-navbar>
        <ion-title>Home</ion-title>
    </ion-navbar>
</ion-header>


<style>
    .highlight {
        background-color: #777;
    }
</style>

<ion-content padding>
    <ion-item *ngFor="let date of testList">
        {{date.date}}
        <ion-item *ngFor="let item of date.item; let i= index" [class.highlight]="item.id == selectedOne" (tap)="onSelected(item)">
            {{item.name}}
        </ion-item>
    </ion-item>
</ion-content>

您的home.ts onSelected方法如下:〜

  onSelected(item) {
    this.selectedOne = item.id;
  }

答案 2 :(得分:0)

将selectedOne变量更改为Object

public selectedOne = {id: 12, name: 'Stenly'};

并在循环[class.highlight]="(item.id == selectedOne.id && item.name == selectedOne.name)"

中更新条件
 <ion-item *ngFor="let item of date.item; let i= index" [class.highlight]="(item.id == selectedOne.id && item.name == selectedOne.name)" (tap)="onSelected(i)">
           {{item.name}}
    </ion-item>

https://stackblitz.com/edit/ionic-select-one