【问题标题】:how to select specific one from child array如何从子数组中选择特定的一个
【发布时间】:2019-09-23 09:35:24
【问题描述】:

当我选择第一个父子数组时,它会选择所有其他父子数组。我知道这是因为索引 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;
        }
  }

我想选择特定的并突出显示它。

【问题讨论】:

  • 我们可以根据文本而不是索引进行选择吗?
  • 我们可以修改您提供的对象数组吗?
  • 嘿,Asim,名称和 ID 将是动态的,我将从后端获取它。是的,我们可以,但它应该像图片一样显示,先是父元素,然后是子元素

标签: javascript angular typescript ionic3 ngfor


【解决方案1】:

我将首先为列表中显示的每个项目添加一个选定的属性,您可以使用以下所有内容来执行此操作,尽管我会将其移至 ngOnInit()

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

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

<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,反之亦然。

编辑

定义一个 clear 函数来清除所有,与第一个迭代到所有为 false 的位相同。


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

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

【讨论】:

  • 嘿 dince12,您的代码按预期工作,但是现在当我选择孩子的父母时,在第二个孩子之后它不会删除第一个孩子的突出显示,即使我选择不同的父母孩子。当我选择其他孩子时,有什么办法可以消除突出显示
  • 对不起,我忘了检查是否进行了编辑并检查了它是否有效
  • 嘿,Dince12。这已经非常接近了,但是我仍然可以选择所有其他孩子并使其突出显示,如果我选择了第一个父母孩子然后转到第二个父母孩子,那么应该从第一个父母孩子中删除突出显示。非常感谢
  • 啊,我看到一个时间我虽然每个人都没有担心上一个担心的上身: - ) span>
  • Hey Dince12,这可以重置整个数组,onSelected(item, parent) { this.testList.forEach(data => data.item.forEach(each => { each.selected = false; }) ) item.selected ? item.selected = false : item.selected = true; }
【解决方案2】:

检查 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;
  }

【讨论】:

  • 这是很棒的解决方案。谢谢@Sourav
  • 很高兴@Indraraj26 有用 :)
【解决方案3】:

将 selectedOne 变量更改为 Object

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

并在循环中更新条件[class.highlight]="(item.id == selectedOne.id &amp;&amp; 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

【讨论】:

  • 这将是静态的,如果我每次都得到不同的 id 和 name 所以它会失败 class.highlight 条件,这不会与其他 id 和名称一起使用
  • 你想在哪里动态化对象?
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
相关资源
最近更新 更多