1

当我尝试像这样查询已批准的标签时,它会返回所有条目而不是已批准的条目

getAllApprovedTags(): Observable<Array<Tag>> {
    return this.tagsService.getWithQuery({tagStatus:'Approved'});
}

我也试过以下

getAllApprovedTags(): Observable<Array<Tag>> {
        return this.tagsService.getWithQuery("tagStatus='Approved'");
}

以及以下

getAllApprovedTags(): Observable<Array<Tag>> {
        return this.tagsService.getWithQuery("tagStatus=Approved");
}

我在用

Angular CLI: 11.0.1
Node: 10.19.0
OS: linux x64
NgRx/Data: 10.1.2

后端是

环回 4 和 MongoDB

我有以下型号

export class Tag {
  constructor(
    public id: string,
    public tagName: string,
    public tagDescription: string,
    public tagStatus: string,
    public createdDate: Date,
  ){ }
}

我的实体配置如下所示

const entityMetadata: EntityMetadataMap = {
  Tag: {},
};

const pluralNames = {
  Tag: 'Tags',
};

export const entityConfig = {
  entityMetadata,
  pluralNames,
};

服务类如下所示

@Injectable({
  providedIn: 'root'
})
export class TagsService  extends EntityCollectionServiceBase <Tag> {
  constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
    super('Tag', serviceElementsFactory);
   }
}

数据如下

示例数据

4

1 回答 1

-1

getWithQuery只需将查询参数添加到端点 URL:

/api/tags/?tagStatus=Approved

即使服务器设置为处理此问题,它也可能不是您想要做的。需要更多上下文,但根据您的问题,听起来您希望将Tag实体集合过滤到状态为“已批准”的实体。如果是这样,也许您想要filterFn此处的文档):

const entityMetadata: EntityMetadataMap = {
  Tag: {
    filterFn: (tags: Tag[], status: TagStatus) => {
      return tags.filter(tag => tag.status === status);
    }
  },
};

在你的组件中:

getAllApprovedTags(): Observable<Array<Tag>> {
  this.tagService.setFilter(TestStatus.Approved); // or 'Approved' if you don't use an enum
  return this.tagsService.filteredEntities$;
}

但是,据我了解,使用该过滤器的任何其他地方也将被更改,因此您的用例最好使用selector.

@Injectable({
  providedIn: 'root'
})
export class TagsService extends EntityCollectionServiceBase <Tag> {

  approvedTags$ = this.entities$.pipe(select(selectApprovedTags));

  constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
    super('Tag', serviceElementsFactory);
  }
}
// selectors

export const selectApprovedTags = createSelector(
  (tags) => tags,
  (tags: Tag[]) => tags.filter(tag => tag.status === TagStatus.Approved)
);

以上selector实现基于我在他们的演示中看到的

于 2021-05-28T22:05:26.063 回答