如何从缓存的可观察数组中查找单个项目

问题描述

过去几天来一直试图解决这个问题,但我没有运气。

这就是我想要做的。

我的网站向http get请求获取项目列表,并使用ngFor循环在首页上显示这些项目。我在我的Observable上使用shareReplay缓存了这些结果,这样当我查看单个项目时-不需要执行其他网络请求。

我的问题是,在缓存了缓存之后,我找不到从可观察对象数组中提取单个项目的方法。我知道.find或.filter,但它们看起来好像是在最初获取可观察对象时使用的,而不是在将其与shareReplay缓存在一起后使用的。

下面是我的代码。

DECLARE @Date Date =GetDate();
SELECT @Date =Format(@Date,'yyyyMM01');
SELECT [Date]=@Date

我尝试了很多组合。在服务中添加.find无效,因为我的项目componenet无法获得所有项目。我累了

    //service.ts

    get allProjects() {
        if (!this.cache$) {
            this.cache$ = this.fetchProjects().pipe(shareReplay(1));
        }
        return this.cache$;
    }


    fetchProjects() {
    return this.http
        .get<Project[]>(
            'https://admin.steezy.io/wp-json/wp/v2/posts?categories=5'
        )
        .pipe(
            map((projects) => {
                return projects.map((item) => {
                    return new Project(
                        item.id,item.slug,item.title,item.content,item.better_featured_image,new Acf(
                            item.acf.projectDescription,item.acf.projectTypeOfWork,item.acf.sliderLinks
                        )
                    );
                });
            }),);
     }

     // component.ts

     ngOnInit(): void {
           const slug = this.route.snapshot.params['slug'];
           this.project = this.projectService.singleProject;
           return this.project;
     }

但是它告诉我 this.project = this.projectService.cache$.find( (project) => project.slug == slug );

我尝试使用.filter并遇到相同的问题。

这似乎是一件容易的事,但是由于某种原因,我很沮丧。我已经缓存了数据,我所要做的就是根据弹头挑选一个对象。

有什么想法吗?


编辑:

我根据阿德里安的回答解决了这个问题。现在我的IDE中出现一个小错误

Property 'find' does not exist on type 'Observable<Project[]>'

<div class="container" *ngIf="project$ | async as project"> <div class="row my-5"> <div class="col-sm-12 text-center"> <h1> <!-- {{ project$ | async | json }} --> {{ project.title.rendered }} //project.model.ts export class Project { constructor( public id: number,public slug: string,public title: Title,public content: string,public better_featured_image: string,public acf: Acf ) {} } export class Title { constructor(public rendered: string) {} } export class Acf { constructor( public projectDescription: string,public projectTypeOfWork: string,public sliderLinks: any = null ) {} } 用红色下划线表示,我的想法是title

知道为什么吗?

解决方法

通过地图传递可观察对象

this.project$ = this.projectService.cache$.pipe(
  map(projects => projects.find(project => project.slug == slug))
);

请注意,project $是可观察的,而不是项目对象。您将需要使用异步管道将其解开或订阅。

像这样展开

<ng-container *ngIf="project$ | async as project">
  {{ project | json }}
</ng-container>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...