Angular - NgRedux - выберите, наблюдаемый не запускается при изменении дочерних свойств - PullRequest
0 голосов
/ 19 февраля 2019

Эй, есть кое-что, в чем я не уверен в 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];
    }
    ...
}

Я не могу понять, почему наблюдаемое не излучает, когда я изменяю текущее состояние типа поиска, это редуктор, который обрабатывает изменения типа поиска (я использую immer для неизменяемого состояния)

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

Кто-нибудь знает, почему это не работает, как ожидалось?Мое первое предположение состоит в том, что Redux не работает должным образом с объектами / прототипами, и мое второе предположение заключается в том, что Redux не генерирует изменения для дочерних свойств, так как я выбираю search.engineParams, а не search.engineParams.currentSearchType, но это только предположения, поскольку я не могунайти любую документацию по этим предметам в любом месте.

Конкретное объяснение того, почему это не работает для меня, было бы удивительно, но также была бы очень полезна ссылка на некоторую документацию, которая могла бы помочь мне понять это, спасибо.

...