ngrx/store未更新Angular2服务中的状态

ngrx/store未更新Angular2服务中的状态,ngrx,Ngrx,我有一个减速机: heroStore.reducer.ts 但不知怎的,州政府没有得到更新。它生成以下日志: 日志:“新状态”,对象{5:BehaviorSubject{u isScalar:false, 观察者:[],关闭:错误,关闭:错误,hasError:错误, thrownError:null,_值:对象{uid:…,名称:…} 日志:“服务中返回的状态”,对象{} 因此,减速器实际上返回正确的新状态。但是当在服务中订阅时,我仍然得到一个空对象 如果我理解正确,ngrx/store中的存

我有一个减速机:

heroStore.reducer.ts

但不知怎的,州政府没有得到更新。它生成以下日志:

日志:“新状态”,对象{5:BehaviorSubject{u isScalar:false, 观察者:[],关闭:错误,关闭:错误,hasError:错误, thrownError:null,_值:对象{uid:…,名称:…}

日志:“服务中返回的状态”,对象{}

因此,减速器实际上返回正确的新状态。但是当在服务中订阅时,我仍然得到一个空对象

如果我理解正确,ngrx/store中的存储是一个rxjs行为子对象,它反过来应该返回订阅时的最后一个值。从行为主体的文档中:

观察者可以订阅主题以接收最后(或初始)值和所有后续通知


那么,状态怎么可能仍然是空对象呢?

您的
getHero
没有正确编码,我认为它返回了一个未赋值的值。更好的写作方法是:

getHero(heroId: string): BehaviorSubject<Hero> {
  let state = new BehaviorSubject<Hero>();
  this.store.select('heroStore').subscribe(s => state.next(s[heroId]));
  return state;
}
getHero(英雄:字符串):行为主体{
let state=new BehaviorSubject();
this.store.select('heroStore').subscribe(s=>state.next(s[heroId]);
返回状态;
}
或者更好:

getHero(heroId: string): Observable<Heor> {
    return this.store.select('heroStore')
        .map(heros => heros[heroId];
}
getHero(英雄:字符串):可观察{
返回此.store.select('heroStore')
.map(heros=>heros[herod];
}
或者,如果你真的想变得优雅,这可能会奏效:

getHero(heroId: string): Observable<Heor> {
    return this.store.select('heroStore', heroId);
}
getHero(英雄:字符串):可观察{
返回此.store.select('heroStore',heroId);
}

1)在您的第一个选项中,您在每次检索时都会创建一个新的behaviorSubject 2)您能更具体地指出我的代码中的问题吗?3) 如果我没弄错的话,你的第二个选项返回可观。4) 您的第三个选项将如何满足我的要求?在第一个选项中,我试图靠近您的代码,尽管您创建了一个新主题,但如果您取消订阅,它不会导致问题。保留一个全局主题可能会导致将来请求提供过时的数据(=以前的数据)。select可以执行向下搜索,因此如果提供多个参数,它将向下搜索结果。第一个将获得heroStore,第二个将获得特定字段。至于你的代码。select是异步的,因此在您返回并使用该值之后可能会调用赋值state=s,因此在实际中,当您返回state[hergod]时,state仍然为null state不是未定义的,正如您在我发布的日志中看到的那样,它是{}。根据ngrx/store文档,store是一个BehaviorSubject,因此它在订阅后立即返回一个值。但这是初始值,不是吗?您可能需要更新的值。不管怎么说,rxjs明智的做法似乎不对。我知道这是最后一个值,而不是初始值。从BehaviorSubject的文档中:“观察者可以订阅主题以接收最后(或初始)值和所有后续通知”
getHero(heroId: string): BehaviorSubject<Hero> {
  let state = new BehaviorSubject<Hero>();
  this.store.select('heroStore').subscribe(s => state.next(s[heroId]));
  return state;
}
getHero(heroId: string): Observable<Heor> {
    return this.store.select('heroStore')
        .map(heros => heros[heroId];
}
getHero(heroId: string): Observable<Heor> {
    return this.store.select('heroStore', heroId);
}