#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
запуском.