Angular NgRx无法从存储中选择

Angular NgRx无法从存储中选择,angular,rxjs,store,ngrx,Angular,Rxjs,Store,Ngrx,我正在做一个非常简单的NgRx实现,现在只做一个组件的get。根据Redux Devtool,数据通过有效负载传输,但我似乎无法通过异步管道访问它 开发工具: --更新-- 问题是当我访问ts文件中的切片时,我得到了错误 “网络”类型的参数不能分配给类型的参数 “开始” ts文件 constructor(private store: Store<fromApp.AppState>) {} getDns() { // reach out to ngrx store

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

开发工具:

--更新--

问题是当我访问ts文件中的切片时,我得到了错误

“网络”类型的参数不能分配给类型的参数 “开始”

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)
                    )
                }
            )
    }
和我更新的功能缩减器来访问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指的是整个应用程序状态,而不仅仅是网络状态。应该是

constructor(..., private store: Store<fromApp.AppState>) {}
此外,action.payload是{dns:[6.7.7.7,5.5.5]}。当您在reducer中分配它时,您正在执行dns:[action.payload],因此您最终的网络状态为:

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

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);
}

尝试设置dnsServer=this.store的定义。在getDns之外选择“dns”。如果您使用types,请将dnsServer的type设置为Obseravble。正在ngOninit中调用getDns,因此无论它是否在外部,我都不在乎。我最终会输入可观察的,但这并不能解决我想我知道的问题。返回有效负载对象的值可能与subscribe获取的值不同,然后立即设置。最初可能为空,而async不会返回任何内容,但会在分派后进行更新。但是,如果您希望未定义DNS,则会导致它出错。因此,为什么它在没有安全操作员的情况下发生故障,但在安全的情况下工作。这些值稍后将更新为工作值。如果您将默认状态设置为一个带有DNS和一些伪值的对象,它将工作……试试看!我想出来了。在我的模块中,我有StoreModule.forFeature'network',dnsReducer而不是StoreModule.forFeature'dns',dnsReducer和我是的,我传递的是对象而不是列表,因此这也有帮助。我在“网络”状态下有多个还原器,所以我必须弄清楚如何构造它…您可以在中传递一个对象:.forFeature“网络”{dns:dnsReducer,otherThing:otherThingReducer}。也来看看。这样就不需要再打电话了。以后再打地图。选择只是为了了解这个州的情况。哦,伙计,你是最好的,这正是我想要的!但是有一件事,你如何从网络片访问dns?谢谢如果你想更新你的答案来包含这些,我会把它标记下来这是一个延迟加载的功能,所以我必须从网络状态访问它谢谢你的更新!唯一的问题是它是延迟加载的,所以我无法通过主appstate访问它,它扩展了appstate。
{
    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);
}