【发布时间】:2016-12-06 12:34:21
【问题描述】:
我正在开发一个使用 ngrx 存储方法来管理状态的 angular2 应用程序。应用在github上开源here
问题陈述
我在使用这种方法时面临的具体问题是,当其他可观察对象返回 null 时,使用从一个可观察对象发出的值。
当我的ngrx 存储中有数据时,我不想查询后端api。
Angular2 代码
下面是我的trips.reducer.ts文件
export interface State {
ids: string[];
trips: { [id: string]: Trip };
selectedTripId: string;
}
const initialState = {
ids: [],
trips: {},
selectedTripId: null
}
export function reducer(state = initialState, action: Action ): State {}
export function getTrips(state : State) {
return state.trips;
}
export function getTripIds(state: State) {
return state.ids;
}
export function getSelectedTripId(state: State) {
return state.selectedTripId;
}
下面是我的基本减速器index.ts
export interface State {
trips: fromTripsReducer.State;
}
const reducers = {
trips: fromTripsReducer.reducer,
}
export function getTripsState(state: State): fromTripsReducer.State {
return state.trips;
}
export const getTrips = createSelector(getTripsState, fromTripsReducer.getTrips);
export const getTripIds = createSelector(getTripsState, fromTripsReducer.getTripIds);
export const getSelectedTripId = createSelector(getTripsState, fromTripsReducer.getSelectedTripId);
export const getSelectedCityId = createSelector(getTripsState, fromTripsReducer.getSelectedCityId);
export const getTripsCollection = createSelector(getTrips, getTripIds, (trips, ids) => {
return ids.map(id => trips[id]);
});
export const getSelectedTrip = createSelector(getTrips, getSelectedTripId, (trips, id) => {
return trips[id];
});
现在我可以像这样在trip-detail.component.ts 获得特定的旅行
selectedTrip$: Trip;
constructor(private store: Store<fromRoot.State>) {
this.selectedTrip$ = this.store.select(fromRoot.getSelectedTrip);
}
现在如果我重新加载路由localhost:4200/trips/2,那么我们的商店将初始化为如下所示的initialState
const initialState = {
ids: [],
trips: {},
selectedTripId: null
}
以下方法将不起作用,因为 getTrips 和 getSelectedTripId 将为空
export const getSelectedTrip = createSelector(getTrips, getSelectedTripId, (trips, id) => {
return trips[id];
});
所以现在我可以发出一个后端请求,该请求将只加载基于 url id 的单程,像这样
return this.http.get(`${this.apiLink}/trips/${trip_id}.json`
.map((data) => data.json())
但我只想在商店中不存在旅行时发出后端请求并且
this.selectedTrip$ 返回 null 或 undefined。
this.selectedTrip$ = this.store.select(fromRoot.getSelectedTrip);
【问题讨论】:
标签: angular typescript redux observable ngrx