我正在开发一个Angular2应用程序,我需要为我的一些*ngFor
指令使用过滤器。
我创建了以下Pipe
:
import {Pipe, PipeTransform} from "@angular/core";
@Pipe({
name: 'filter',
pure: false
})
export class FilterPipe implements PipeTransform {
transform(array: Array<Object>, key: string, value: string, negate: boolean): Array<Object> {
if (array === null || array === undefined) {
return [];
} else {
if (negate) {
return array.filter(item => item[key] !== value);
} else {
return array.filter(item => item[key] === value);
}
}
}
}
以下是我如何使用它的示例:
<div class="item" *ngFor="let i of items | filter:'type':'S':true">
但如果我要过滤子属性,它就不起作用。 使用Angular v1.x,我可以应用以下过滤器:
item in array | filter: { type: {subtype: 'foo'}}
你知道我怎么能用我的Angular2管道达到同样的效果? 提前谢谢。
答案 0 :(得分:1)
您可以这样做:
使用此方法或创建自己的方法来提取深层(甚至不是深层属性):
{"Invalid object name 'dbo.ActivityMaps'."} System.Exception {System.Data.SqlClient.SqlException}
现在,您将管道调整为:
getProperty(obj: any, path: string): string {
if (obj == null || obj.constructor !== Object) {
return undefined;
}
const replaced: string = path.replace(/\[(\w+)\]/g, '.$1').replace(/^\./, '');
const keys: string[] = replaced.split('.');
let result: string = obj[keys.shift()];
for (const key of keys) {
if (result == null || result.constructor !== Object) {
return undefined;
}
result = result[key];
}
return result;
}
使用它:
@Pipe({
name: 'filterBy',
pure: false
})
export class FilterByPipe implements PipeTransform {
transform(items: any[], prop: string, term: string, exact: boolean = false): any[] {
if (!Array.isArray(items) || typeof term !== 'string') {
return items;
}
const strTerm: string = `${term}`.toLowerCase();
return items.filter((obj: any) => {
const value: string = this.getProperty(obj, prop);
if (!value) {
return false;
}
const strValue: string = `${value}`.toLowerCase();
return exact
? strTerm === strValue
: strValue.indexOf(strTerm) !== -1;
});
}
或
<div *ngFor="let item of items | filterBy: 'nestedObj.key': search: exact">
根据OP的要求,有一个版本接受另一个参数(<div *ngFor="let item of items | filterBy: 'nestedObj[key]': search: exact">
):
negate
或
<div *ngFor="let item of items | filterBy: 'nestedObj.key': search: exact: negate">
PS :请注意<div *ngFor="let item of items | filterBy: 'nestedObj[key]': search: exact: negate">
和exact
是选项,如果不存在,则自动为negate
。
答案 1 :(得分:0)
您只需确保使用正确的模板语法。
<span *ngFor="let item of items | filter:'key':'value'">
{{item}}
</span>
支持多个参数。
将每个param
与:
{{ myData | myPipe: arg1:arg2:arg3... }}