3

现在我有一个解析器调用标准服务并返回一个 Observable:

return this.someService.getData()
      .map(data=> data.json())

我想用 ngrx 效果替换它并存储。当解析器运行时,我想调度被效果拦截的requestAction,这会产生http请求。返回数据后,我将 dataReceivedAction 与数据一起作为有效负载发送。

基本上我想在解析器中调度一个动作并等到新数据成为存储的一部分。我尝试这样做:

return Observable.combineLatest(
      Observable.of(
        this.store.dispatch(new requestAction())
      ),
      this.store.select(store => store.dataIWaitFor),
      (dispatchedAction, dataArrived) => dataArrived
    )
      .skip(1)

它不起作用,我的意思是解析器不会渲染组件,但是当我在每个返回的 Observables 结束时添加

.do(data => console.log(data))

记录相同的数据。我做错了什么?

4

2 回答 2

2

你可以做这样的事情

@Injectable()
export class SomeGuard implements CanActivate {
constructor(private store: Store<AppState>) {}

waitForDataToLoad(): Observable<Something> {
    return this.store.select(state => state.something)
        .filter(something => something && !something.empty);
}

canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
    this.store.dispatch({type: LOAD_something});

    return this.waitForDataToLoad()
        .switchMap(() => {
            return Observable.of(true);
        });
    }
}
}
于 2017-09-20T17:31:58.740 回答
0

我试图在解析器而不是守卫中实现您的解决方案,它很好地填充了我的 ngrx 商店,但导航没有完成,我被困在使用解析器调用路由的页面上。同样在 store 中,我们可以看到数据和 router-store/requested 和 router-store/navigation,但看不到 router-store/navigated,也没有 router-store/cancel 像警卫阻止导航时那样。你知道我想念什么吗?为什么导航端什么也没发生?我以这种方式在我的路线中使用了解析器:

  {
    path: "params/users",
    canActivate: [IsAdminGuard],
    component: UsersComponent,
    resolve: { usersLoaded: UsersResolver }
  }

这是解析器,几乎就像你的后卫:

@Injectable()
export class UsersResolver implements Resolve<boolean> {

  constructor(private store: Store<appState>) {}

  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean> {        
  // API calls with ngrx effect 
  this.store.dispatch(usersActions.GET_USERS_TRY());

  // Select users in store, switchMap(true) if array not empty
  return this.store.pipe(
    select(UsersSelectors.allUsers),
    filter((allUsers: users[]) => allUsers.length > 0),
    switchMap((allUsers: users[]) => return of(true))
  );
  }
}
于 2022-02-23T21:20:42.003 回答