Angular 角度及;NgRx数据更新和;认购发行

Angular 角度及;NgRx数据更新和;认购发行,angular,ngrx,angular-ngrx-data,ngrx-data,Angular,Ngrx,Angular Ngrx Data,Ngrx Data,我使用的是Angular 11&NgRx数据10.1.2。我使用的是智能组件/哑组件模式 在我的“列表”视图中,当我选择一个项目时,我将发送到传递项目id的详细信息页面 在我的详细信息页面中,我订阅了实体服务getByKey() 这是SiteEntityService: import { Injectable } from '@angular/core'; import { EntityCollectionServiceBase, EntityCollectionServiceElementsF

我使用的是Angular 11&NgRx数据10.1.2。我使用的是智能组件/哑组件模式

在我的“列表”视图中,当我选择一个项目时,我将发送到传递项目id的详细信息页面

在我的详细信息页面中,我订阅了实体服务getByKey()

这是SiteEntityService:

import { Injectable } from '@angular/core';
import { EntityCollectionServiceBase, EntityCollectionServiceElementsFactory } from '@ngrx/data';
import { Site } from 'src/app/models/site.model';

@Injectable({ providedIn: 'root' })
export class SiteEntityService extends EntityCollectionServiceBase<Site> {
  constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
    super('Site', serviceElementsFactory);
  }
}
在编辑组件中,当表单提交时,单击:

  formSubmitted(form: any) {
    let updatedSite = { ...this.site };
    updatedSite.name = form.siteName;

    this.siteEntityService.update(updatedSite).subscribe((x: Site) => {
      this.site = x;
      this.activeModal.dismiss();
    })
  }
更新后,如果我调查存储,我可以看到实体已正确更新,但是,在模式关闭后,显示页面上的订阅不会更新,尽管存储(和数据库)正在更新

那么我错在哪里呢?如何获取显示页面以刷新数据

根据@Fiber的回答编辑:

它现在可以工作了,但由于订阅返回了一个项目数组,这意味着我必须在数组中搜索正确的项目,这似乎并不理想

  loadSite() {
    let sites$ = this.siteEntityService.store.select((new EntitySelectorsFactory().create<Site>('Site')).selectEntities);

    this.subscriptions.add(
      sites$.pipe(
        map((sites: Site[]) => {
          return sites.find((site: Site) => site.id === this.siteId);
        })
      ).subscribe((site: Site) => {
        this.site = site;
      })
    );

    this.siteEntityService.getByKey(this.siteId).subscribe((site: Site) => {
      this.site = site;
    });
  }
loadSite(){
让站点$=this.siteEntityService.store.select((新的EntitySelectorFactory().create('Site')).selectEntities);
此文件为.subscriptions.add(
场地$管道(
地图((站点:Site[])=>{
返回sites.find((site:site)=>site.id==this.siteId);
})
).订阅((站点:站点)=>{
this.site=站点;
})
);
this.siteEntityService.getByKey(this.siteId).subscribe((site:site)=>{
this.site=站点;
});
}

从后端检索数据时将只触发一次:

this.siteEntityService.getByKey(this.siteId).subscribe((site:site)=>{
this.site=站点;
});
该方法连接到数据检索方法,而不是您正在查找的实体存储

您应该创建一个直接连接到存储的可观察对象(ngrx/data为您提供了一个EntitySelectorFactory,以便您能够做到这一点)并监听更改

//每当你用新的“站点”项目更新商店时,就会触发此命令
sites$=this.store.select((新EntitySelectorFactory().create('Site')).selectEntities);
站点$.subscribe((站点:Site[])=>{
this.site=sites.find(s=>s.id==this.siteId);
});
//这将触发初始负载
this.siteEntityService.getByKey(this.siteId);

显然,订阅应该在组件销毁时终止,但为了简洁起见,跳过了该部分。

此.siteEntityService.update中的
内容是什么?我正在使用NgRx Data()模块,因此我的siteEntityService是EntityCollectionServiceBase的扩展。我已经更新了帖子来展示这一点。我已经让它工作了,但是有一个小小的疑问,我已经用更多的信息更新了帖子。更新了我的答案,你是对的,我犯了一个错误-站点$observable正在返回一系列站点,而不仅仅是一个站点。您的地图筛选器解决方案似乎有点拥挤,可以使用.pipe(map(sites=>sites.find(s=>s.id==this.siteId)),或者在订阅中对其进行筛选,如更新的示例所示。如果再次更新,则不需要订阅
this.siteEntityService.getByKey(this.siteId)
,因为它将在商店中随时可见。
  formSubmitted(form: any) {
    let updatedSite = { ...this.site };
    updatedSite.name = form.siteName;

    this.siteEntityService.update(updatedSite).subscribe((x: Site) => {
      this.site = x;
      this.activeModal.dismiss();
    })
  }
  loadSite() {
    let sites$ = this.siteEntityService.store.select((new EntitySelectorsFactory().create<Site>('Site')).selectEntities);

    this.subscriptions.add(
      sites$.pipe(
        map((sites: Site[]) => {
          return sites.find((site: Site) => site.id === this.siteId);
        })
      ).subscribe((site: Site) => {
        this.site = site;
      })
    );

    this.siteEntityService.getByKey(this.siteId).subscribe((site: Site) => {
      this.site = site;
    });
  }