NgRx 无法 select 来自商店

NgRx can't select from store

我正在做一个非常简单的 NgRx 实现,现在只是为一个组件做 get。根据 Redux Devtool,数据通过有效负载传递,但我似乎无法通过异步管道访问它。

开发工具:

---更新----

问题是当我访问我的 ts 文件中的切片时,出现错误

Argument of type '"network"' is not assignable to parameter of type '"start"'.

ts 文件

constructor(private store: Store<fromApp.AppState>) {}
getDns() {
        // reach out to ngrx store
        this.dnsServers$ = this.store.select('network').map(network => network.dns)
        console.log(this.dnsServers$)
        // get current dns IPs'
        this.networkService.getDns()
            .subscribe(
                (dnsList: Dns) => {
                    console.log(dnsList.dns);
                    this.store.dispatch(
                        new LoadIpSuccessAction(dnsList.dns)
                    )
                }
            )
    }

我的功能模块

StoreModule.forFeature('network', { dns: dnsReducer })

我的 root reducer(我没有任何模块没有延迟加载,所以我的 root reducer 是空的...不知道如何让它工作)

import { Action } from '@ngrx/store';

export interface State {
    start: string;
}

const initialState: State = {
    start: ''
}

export function startReducer(state = initialState, action: Action) {
    return state;
}

和我更新的 feature reducer 来访问 dns 数组

import * as NetworkActions from './network.actions';
import * as fromApp from '../../store/app.reducers';

export interface NetworkState extends fromApp.AppState {
    dns: DnsState;
}

export interface DnsState {
    dns: string[];
}

const initialState: DnsState = {
    dns: []
}

export function dnsReducer(state = initialState, action: NetworkActions.DnsActions) {
    switch (action.type) {
        case NetworkActions.LOAD_IP_SUCCESS:
            return {
                ...state,
                dns: [...action.payload]
            }
        default:
            return state;
    }
}

在您的构造函数中,store 指的是整个应用程序状态,而不仅仅是 network。应该是

constructor(..., private store: Store<fromApp.AppState>) {}

您需要使用

访问它
this.dnsServers$ = this.store.select('network').map(network => network.dns);

另外,action.payload{dns: ["6.7.7.7", "5.5.5.5"]}。当你在你的减速器中分配它时,你正在做 dns: [action.payload],所以你最终得到 NetworkState 是:

{
    dns: [
        { dns: ["6.7.7.7", "5.5.5.5"] }
        ]
}

如果您想在每次需要状态切片时减少构造函数中的逻辑,可以使用选择器:

import { createFeatureSelector, createSelector } from "@ngrx/store";

export const selectNetwork = createFeatureSelector<fromNetwork.NetworkState>('network');
export const selectNetworkDns = createSelector(selectNetwork, (state) => state.dns);

要在构造函数中使用它:

constructor(private store: Store<fromApp.AppState>) {
    this.dnsServers$ = this.store.select(selectNetworkDns);
}