Angular-NgRedux-选择,可观察到的子属性更改时不会触发

时间:2019-02-19 14:24:37

标签: javascript angular typescript redux ngredux

嘿,我对NgRedux不太了解,我无法在互联网上找到任何信息,因此希望这里有人可以帮助我。

让我们说这是我的减根剂:

interface RootState {
    content: ContentState;
    layout: LayoutState;
    metadata: MetadataState;
    search: SearchState;
}

然后这是我的搜索还原器:

export interface SearchState {
    engineParams: SearchEngineParams;
    searchHistory: SearchHistory[];
    searchRestrictions: SearchRestrictions;
}

我这样设置:

...
const searchReducer = createReducer<SearchState>({}, INITIAL_STATE);
...
const rootReducer = combineReducers<RootState>({
    content: contentReducer,
    layout: layoutReducer,
    metadata: metadataReducer,
    search: searchReducer,
});

我的问题是当我在SearchState中选择搜索属性时:

class SearchService {
    ...
    @select(['search', 'engineParams'])
    public searchEngineParams$: Observable<SearchEngineParams>;
    private sub: Subscription;
    ...
    constructor(...) {
        this.sub = this.searchEngineParams$.subscribe((params) => {
            console.log('search params changed!', params);
        });
    }
    ...
}

仅在初始化期间调用console.log的订阅,但是当engineParams内部的属性发生更改时,则不会发生任何事情。

SearchEngineParams是一个看起来像这样的对象。

class SearchEngineParams{
    ...
    constructor(
        public currentSearchType: SearchType,
        public searchTypeStates: SearchTypeState,
    ) { }

    public get currentSearchTypeState() {
        return this.searchTypeStates[this.currentSearchType];
    }
    ...
}

当我更改当前搜索类型状态时,我无法弄清楚为什么观察不到的对象不发光,这是处理搜索类型更改的简化器(我将沉浸式用于不可变状态)

reducer.on(setSearchType, (state, payload: SetSearchTypePayload) => {
    return produce(state, (draftState) => {
        draftState.engineParams.currentSearchType = payload.searchType;
    });
});

有人知道为什么这没有按预期进行吗?我的第一个猜测是redux无法与对象/原型正常工作,而我的第二个猜测是redux不会针对子属性发出更改,因为我选择的是search.engineParams而不是search.engineParams.currentSearchType,但这只是猜测,因为我无法在任何地方都可以找到有关这些主题的任何文档。

具体说明为什么这对我不起作用将是令人惊讶的,但是,指向一些可以帮助我弄清楚这一点的文档的链接将非常有用,谢谢。

0 个答案:

没有答案