You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用getReloadAction()时Ngrx Action为何返回undefined?

问题分析与解决方案

核心原因

你遇到的问题几乎可以确定是**NgrxClass的实例被重新初始化**了。比如在Angular中,如果这个类是组件级注入的依赖(未设置单例),或者每次调用时都通过new NgrxClass()创建新实例,那么执行load的实例和调用getReloadAction的实例根本不是同一个,后者的_reloadAction自然会是undefined。

解决方案

1. 确保NgrxClass为全局单例(Angular场景)

如果是Angular项目,将类注册为全局单例服务,保证整个应用只有一个实例:

@Injectable({ providedIn: 'root' }) // 关键配置:全局单例
export class NgrxClass {
    public _reloadAction: Action;

    constructor(private _store: Store<VehicleState>) {}

    public load(vId?: number): void {
        this._reloadAction = VehiclesLoadAction({ vId });
        this._store.dispatch(this._reloadAction);
    }

    public getReloadAction(): Action {
        return this._reloadAction;
    }
}

2. 避免重复创建实例(非Angular场景)

如果不是Angular环境,确保在业务流程中只创建一次NgrxClass实例并复用:

// 在全局/共享作用域创建唯一实例
const ngrxInstance = new NgrxClass(storeInstance);

// 业务代码中统一使用该实例
ngrxInstance.load(123);
const action = ngrxInstance.getReloadAction(); // 此时能获取到正确的Action实例

禁止在调用load和getReloadAction的位置分别new新实例。

3. 备选方案:用Ngrx状态存储替代类属性

如果不想依赖单例机制,可以把reloadAction的信息存入Ngrx状态,这样无论哪个实例都能从Store中获取:

// 先扩展VehicleState,添加存储action的字段
export interface VehicleState {
    // 原有状态字段...
    reloadAction?: Action;
}

// 修改NgrxClass逻辑
export class NgrxClass {
    constructor(private _store: Store<VehicleState>) {}

    public load(vId?: number): void {
        const action = VehiclesLoadAction({ vId });
        this._store.dispatch(action);
        // 将action存入Store状态
        this._store.dispatch({
            type: 'SET_RELOAD_ACTION',
            payload: action
        });
    }

    public getReloadAction(): Observable<Action | undefined> {
        // 从Store中读取,不再依赖类实例属性
        return this._store.select(state => state.reloadAction);
    }
}

这种方式更贴合Ngrx的状态管理思路,不依赖实例唯一性。


内容的提问来源于stack exchange,提问作者sridhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:07:14