Ngrx 如何在EntityCollectionService上使用setFilter

Ngrx 如何在EntityCollectionService上使用setFilter,ngrx,angular-ngrx-data,Ngrx,Angular Ngrx Data,我想知道setFilter方法如何用于@ngrx/data中的EntityCollectionService。这些提示说明了如何使用它,但没有示例显示实际使用的setFilter(pattern:any)函数。由于参数可以是任何类型,我无法真正推断这里应该做什么 基本上,我在使用@ngrx/data模块的数据存储中有一个对象列表。我想定义一个过滤器,以便订阅EntityCollectionService的FilterIdentity$observable。我可以成功订阅实体$observable

我想知道setFilter方法如何用于@ngrx/data中的EntityCollectionService。这些提示说明了如何使用它,但没有示例显示实际使用的setFilter(pattern:any)函数。由于参数可以是任何类型,我无法真正推断这里应该做什么

基本上,我在使用@ngrx/data模块的数据存储中有一个对象列表。我想定义一个过滤器,以便订阅EntityCollectionService的FilterIdentity$observable。我可以成功订阅实体$observable并收到完整的未过滤列表。以前,我在EntityCollectionService之外进行过滤,但我想利用内置的过滤机制


导出类MyComponent实现OnInit{
filteredProjects$:可观察;
类型筛选选项:筛选选项[];
stageFilterOptions:FilterOption[];
构造函数(私有projectService:ProjectEntityService,ptivate metadataService:metadataService){}
恩戈尼尼特(){
this.typeFilterOptions=this.metadataService.getProjectTypes();
this.stageFilterOptions=this.metadataService.getProjectStages();
this.filteredProjects$=this.projectService.filteredEntities$;
}
onFilterChange(){
typeFilter=typeFilterOptions.filter(option=>option.isChecked.map(option.name);
stageFilter=stageFilterOptions.filter(option=>option.isChecked.map(option.name);
this.projectService.setFilter(项目=>{
返回值(typeFilter.indexOf(project.type)>=0)&&
(stageFilter.indexOf(project.stage)>=0);
}
}
}
上面的代码是我尝试正确设置筛选器的最佳方法。显然,这并没有像我预期的那样起作用。当将筛选器设置为筛选器函数时,没有任何变化,即使我可以看到
set filter
操作按预期触发。此时仍没有对实体进行筛选。参数为标签为
模式:任何
都会让我认为它应该是函数以外的东西,但我同样无法从文档中推断出它所期望的是什么。

好的,因此深入研究我能够找出如何在ngrx/数据实体服务上使用过滤器

我缺少的部分是在实体服务元数据配置()中定义过滤函数:

应用程序模块.ts


常量entityMetadata:EntityMetadataMap={
项目:{
//模式可以是您想要的任何对象。这与setFilter中使用的参数相同(模式:any)
filterFn:(实体:项目[],模式:{types:string[],阶段:string[]})=>{
返回Entityes.filter(实体=>{
返回(pattern.types.indexOf(entity.type)>=0)&&
(pattern.stages.indexOf(entity.stage)>=0)
});
}
}
};
@NGD模块({
...
})
导出类AppModule{
构造函数(专用eds:EntityDefinitionService){
eds.registerMetadataMap(entityMetadata);
}
}
然后在组件中,您只需创建filter对象并将其用作实体服务上设置filter的参数:

my.component.ts

导出类MyComponent实现OnInit{
filteredProjects$:可观察;
类型筛选选项:筛选选项[];
stageFilterOptions:FilterOption[];
构造函数(私有projectService:ProjectEntityService,私有metadataService:metadataService){}
恩戈尼尼特(){
this.typeFilterOptions=this.metadataService.getProjectTypes();
this.stageFilterOptions=this.metadataService.getProjectStages();
this.filteredProjects$=this.projectService.filteredEntities$;
}
onFilterChange(){
typeFilter=typeFilterOptions.filter(option=>option.isChecked.map(option.name);
stageFilter=stageFilterOptions.filter(option=>option.isChecked.map(option.name);
this.projectService.setFilter({
类型:typeFilter,
阶段:阶段过滤器
});
}
}
此时,当调用setFilter时,模板中订阅filteredProjects$observable的任何内容都将获得更新筛选实体。例如:

my.component.html

。。。
...

一个简单的方法就是使用实体的模型,比如用户

export const entityMetadata: EntityMetadataMap = {
  User: {
    filterFn: (entities: User[], { email, name }: Partial<User>) =>
      entities
        .filter((user) => (email? -1 < user.email.indexOf(email) : true))
        .filter((user) => (name ? -1 < user.name.indexOf(name) : true))
  }
};

不错,它很有效。但我在entityMetaData中使用了多个
filterFn
,并根据需求调用每个函数??
constructor(private collectionService: UserCollectionService) {
  ...
}

filter() {
  this.collectionService.setFilter({ name: 'jan' });
  // or this.collectionService.setFilter({ name: 'jan', email: '@github.com' });
}