angular - 如何强制在 angular2 中执行自定义过滤管道

标签 angular filter pipe

我对 angular2 中的自定义过滤有疑问。

这是我的场景:

我的页面包含多个自定义组件。其中一个负责在页面左侧显示数据:(componentA)

  <md-list-item *ngFor="let item of items | filter :  filter | sort:   sort; let i = index"  " >
       <template [render]="itemTemplateRef" [context.item]="item" 
       [context.index]="index"></template>
   </md-list-item>

而且,过滤器是通过自定义过滤完成的:

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



@Pipe({ name: 'filter' })

export class FilterPipe implements PipeTransform {
    transform(values: any[], filter: any): any {
        if (typeof filter !== "function") return values;
          return values.filter((elem) => {
             return filter(elem);
        });
    }
}

在主页中,我将一个函数作为输入属性发送到组件 A 中:

   public filter = (element: MyBean) => {
             return (element.email !== undefined);

    }

在加载页面时,它的执行没有任何问题。但我想通过单击复选框多次更改过滤条件。 我知道这个事实,如果输入值发生变化,就会执行纯过滤。 但我不知道,我的场景中的哪个输入值应该更改为强制过滤?

当我在复选框的 Onchange 事件中添加以下函数时,不会过滤任何内容。(项目绑定(bind)到我的组件显示的数据中)

    createFilterCondition = (searchCondition: string) => {

        items.filter((element) => {
            return this.doFilter(elem);
        });
    }
   public doFilter= (element: MessagesBean) => {

        return (element.email !== undefined);
    }

感谢您的帮助

最佳答案

有两种方法

使管道不纯净

@Pipe({ name: 'filter', pure: false })

缺点是管道将被频繁执行(每次运行更改检测时)。您可以通过缓存结果进行优化,并且仅在其中一个参数发生更改时才进行过滤,但检查数组是否已修改也不是太便宜。

另一种方法是将附加参数传递给管道。如果管道的值或参数发生更改,Angular 会再次执行管道

@Pipe({ name: 'filter' })

export class FilterPipe implements PipeTransform {
    transform(values: any[], filter: any, changeIndicator: number): any {
        if (typeof filter !== "function") return values;
          return values.filter((elem) => {
             return filter(elem);
        });
    }
}

并非如此,您只需在组件中增加 changeIndicator 即可使 Angular 在下一次更改检测运行时再次执行管道。

关于angular - 如何强制在 angular2 中执行自定义过滤管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40033084/

相关文章:

javascript - 正则表达式 - 忽略引号/HTML(5) 属性过滤之间的文本

javascript - 返回仅包含正值的格式化对象

python - 如何准确测量流经命名管道的比特率?

javascript - 如何检测 Angular 应用程序中与 rxjs 相关的内存泄漏

javascript - 如何获取 Angular 4 项目构建中包含的 .json 文件?

javascript - 如何转换来自 http.post 响应 json 的数据以便我可以在我的应用程序中使用它?

javascript - renameFiles - 获取文件名数组并根据它们在数组中出现的次数重命名它们

Angular 8 ng适用于键值管道和 ng 模型。存在具有约束力的值(value)观问题

c++ - 父进程如何用一个管道向 n 个子进程发送消息?

c - 我错误地使用了 close() 吗?