【问题标题】:flexible pipe to filter objects过滤物体的软管
【发布时间】:2017-10-18 08:58:33
【问题描述】:

我正在尝试制作一个灵活的管道来过滤我的对象数组以使用 *ngFor 显示它

<div class="wrapper" *ngFor="let item of items | myFilter:property:true">

例如,我只想为具有真实属性的对象显示 div:

[
{'name':'first', 'property': 'true'}, 
{'name':'last', 'property': 'false'}
]

当我尝试像这样动态设置属性时,它似乎不起作用

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
name: 'myFilter'
})
export class FilterPipe implements PipeTransform {
     transform(items: any[], key: any, value: any): any {
         return items.filter(item => item[key] === value ? item : null);
     }
}

我也试过这个

item['"' + key + '"']

还有这个(带有 es6 模板字符串)

item[`"$key"`]

但是如果我像这样直接调用属性,这个管道效果很好

item.property

我真的需要让它更灵活,因为我的应用中有很多情况需要按不同的属性值过滤项目

【问题讨论】:

标签: javascript angular typescript angular-pipe


【解决方案1】:

Array.filter 期望您的过滤器函数返回 boolean,这意味着您应该为此更改过滤器:

transform(items: any[], key: any, value: any): any {
     return items.filter(item => item[key] === value);
 }

来源:MDN

【讨论】:

  • 感谢纠正,但它仍然无法正常工作。正如我所说,它正在使用直接属性调用
  • 您可能应该在返回之前使用 console.log 检查 item[property] 是否存在(检查 console.log(items[0][property]))
【解决方案2】:

您的管道绝对正确,您只是缺少 HTML 上的 ''。尝试这样称呼它:&lt;div class="wrapper" *ngFor="let item of items | myFilter:'property':true"&gt;,它将完美运行。这是因为管道需要一个字符串,但您提供的是对象引用。属性 != '属性'

【讨论】:

  • 很高兴它有帮助:)
  • 记住键值也是一样的,如果你想比较字符串而不是布尔值,你必须使用'':)
  • item['"' + key + '"'] 和 item['"' + key + '"']
  • 我的意思是 item['"' + key + '"'] 和 item["$key"] ,因为我试图像你一样解决这个问题,但是以不同的方式,不添加 '' in html
  • 因为通过编写“myFilter : property”,您将传递给您的键值一个名为“property”的对象,它不存在,是未定义的。相反,您必须传递一个包含要比较的有效值的字符串
猜你喜欢
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多