javascript - 为什么我的 @Effect 在 Angular 6 中用 ngrx 覆盖现有状态?

标签 javascript angular ngrx ngrx-effects

我在 Angular 6 应用程序中使用 ngrx,我可以成功从数据库加载数据并将其显示在屏幕上。但是,当我导航到应用程序中的新页面然后返回时,状态不会保留,并且似乎再次调用 @Effect 并再次从数据库加载数据。这是我的代码:

效果

export class ProductEffects {
    constructor(private productService: ProductService, private actions$: Actions) { }

    @Effect()
    loadProducts$: Observable<Action> = this.actions$.pipe(
        ofType(productActions.LOAD_ACTION),
        switchMap(action =>
            this.productsService.getProductDetails().pipe(
                map(product => new productActions.LoadSuccess(product)),
                catchError(err => of(new productActions.LoadError(err)))
            )
        )
    );

reducer

export interface ProductState {
    product: Product;
}

const initialState: ProductState = {
    product: {}
};

export function reducer(state = initialState, action: Action) {
    switch (action.type) {
        case SET_PRODUCT:
            return { ...state, product: (action as SetProductAction).payload };

        case LOAD_SUCCESS:
            return { ...state, product: (action as LoadSuccess).payload, error: '' };

        default: return state;
    }
}

操作

export const SET_PRODUCT = '[Product] Set Product';
export const LOAD = '[Product] Load';
export const LOAD_SUCCESS = '[Product] Load Success';
export const LOAD_ERROR = '[Product] Load Error';

export class SetProductAction implements Action {
    readonly type = SET_PRODUCT;
    constructor(public payload: Product) { }
}

export class Load implements Action {
    readonly type = LOAD;
}

export class LoadSuccess implements Action {
    readonly type = LOAD_SUCCESS;
    constructor(public payload: Product) { }
}

export type ProductActions = SetProduct | Load | LoadSuccess;

商店

export interface State extends fromRoot.AppState {
    product: fromProduct.ProductState;
}

// selectors
const getProductState = createFeatureSelector<fromProduct.ProductState>('product');

export const getProduct = createSelector(
    getProductState,
    state => state.product
}

组件

products$: Observable<Product>;

constructor(private store: Store<fromProduct.State>) { }

ngOnInit() {
    this.store.dispatch(new Load());
    this.products$ = this.store.pipe(select(fromProduct.getProduct));
}

最佳答案

你的 ngrx 实现对我来说似乎一切正常。你所描述的情况是完全正常的行为。一旦您离开页面,该组件就会被销毁并创建新的组件,即调用 ngOnInit 。如果将加载逻辑放在 ngOnInit 中,则每次导航到此页面时都会加载状态。

关于javascript - 为什么我的 @Effect 在 Angular 6 中用 ngrx 覆盖现有状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51675654/

相关文章:

angular - ngrx Reducer 改变多个状态

javascript - 从 html 中的另一个 javascript 调用函数

javascript - 如何更改模板中的日期类型? Angular 2+

angular - 如何在 Angular 2 中使用 'ng-if'

json - Angular 2 - 创建一个嵌套的 JSON 对象

javascript - 管道内的映射被忽略并且不会触发http调用

javascript - "var FOO = FOO || {}"(将变量或空对象分配给该变量)在 Javascript 中意味着什么?

javascript - 触发 Web 浏览器下载 Blob 响应

javascript - jQuery/Javascript 交互式时区 map

angular - 添加StoreModule.forFeature(...)后无法访问存储的数据