Возвращает значение Oberservable / доступа к хранилищу в RouteSerializer?

#angular #ngrx #ngrx-router-store

#angular #ngrx #ngrx-router-store

Вопрос:

Есть ли какой-либо возможный способ для RouteSerializer in ngrx-router-store вернуть либо a Promise , либо an Observable ?

Чего я действительно пытаюсь добиться, так это найти некоторые метаданные ссылки, которые хранятся в хранилище. Но единственный способ доступа к значениям хранилища — через this._store.select который возвращает an Observable . Я не вижу в документах ничего, что допускало бы этот возвращаемый тип, поэтому публикую здесь, прежде чем я поцарапаю этот подход и попробую что-то другое. Просто кажется странным, что ngrx откажется работать с Observables любым сценарием…

 export class CustomSerializer implements RouterStateSerializer<RouterStateUrl> {
    serialize(routerState: RouterStateSnapshot, private _store: IAppStore): RouterStateUrl {
        let route = routerState.root;

        while (route.firstChild) {
            route = route.firstChild;
        }

        const {
            url,
            root: { queryParams },
        } = routerState;
        const { params } = route;

        // Only return an object including the URL, params and query params
        // instead of the entire snapshot
        return this._store.select( state => state.navStore.links).pipe(
            map( links => {
                const l = links.find(l => l.id === 123);
                return { url, params, queryParams, l };
            })
        );
    }
}
 

Ответ №1:

Просто подпишитесь на хранилище и поддерживайте ссылки в качестве переменной-члена:

 export class CustomSerializer implements RouterStateSerializer<RouterStateUrl> {
    links: string[] = [];
    constructor(private store: IAppStore) {
         this._store.select( state => state.navStore.links).subscribe(t => {
            this.links = t;
         });
    }
    serialize(routerState: RouterStateSnapshot, private _store: IAppStore): RouterStateUrl {
        let route = routerState.root;

        while (route.firstChild) {
            route = route.firstChild;
        }

        const {
            url,
            root: { queryParams },
        } = routerState;
        const { params } = route;

        // Only return an object including the URL, params and query params
        // instead of the entire snapshot
        
        const l = this.links.find(l => l.id === 123);
        return { url, params, queryParams, l };
            
        
    }
}
 

Комментарии:

1. Существует нулевая гарантия того, что подписка получит событие перед serialize запуском.