Как повторно запустить преобразователи при изменении queryParams

Я работаю над этим несколько дней, но пока не нашел решения.

У меня есть служба сопоставления, которая должна возвращать Observable:

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) : Observable<any>|Promise<any>{
    return Observable.forkJoin(
         this.http.get(first call with queryParam),
         this.http.get(second call with queryParam),             
    );
}

Я подписываюсь на свои данные ActivatedRoute в компоненте, и он работает очень хорошо.

НО, как вы можете видеть в приведенном выше коде, у моего компонента есть queryParam, и мои вызовы API зависят от этого queryParam. Когда я меняю его вручную, он не «разрешает» маршрут снова.

Я прекрасно понимаю почему, читаю документацию.

Есть ли у кого-нибудь обходной путь? Можно ли вообще подписаться на params и вернуть Observable в этой ситуации?

Я пробовал это до сих пор, но он не возвращает Observable, поэтому ничего не делает:

this.router.events.subscribe(event => { 
    if(event instanceof ResolveEnd){
      // My previous Observable.forkJoin
    }
});

Спасибо :) !

----------- РЕШЕНИЕ (спасибо Maximus): -----------

Добавьте в маршрутизацию:

{
   path: 'some path',
   runGuardsAndResolvers: 'paramsOrQueryParamsChange'
   ...
}

Тогда не нужно подписываться на событие маршрута или что-то еще! Магия!


person KCarnaille    schedule 21.07.2017    source источник
comment
Поскольку ваши данные изменяются в соответствии с вашим queryParams, подписка на queryParams должна быть в ngOnInit. Резолвер хорош для данных, которые не меняются.   -  person Radouane ROUFID    schedule 21.07.2017
comment
Да, это то, что реализовано на данный момент. Моя проблема в том, что у меня есть ~ 8 вызовов API, которые должны создавать много вещей. Я не думаю, что есть решение моей проблемы, но я предпочитаю спросить ..   -  person KCarnaille    schedule 21.07.2017
comment
Вы пробовали навигацию по ByUrl? Я думаю, что это заставляет компонент повторно разрешать данные. Примечание: это не решает проблему ваших 8 вызовов API   -  person Radouane ROUFID    schedule 21.07.2017
comment
Я не очень хорошо знаком с navigateByUrl. Читаю какой-то документ, спасибо :)   -  person KCarnaille    schedule 21.07.2017


Ответы (1)


Вы можете использовать runGuardsAndResolvers для маршрута. Вот что говорят официальные документы:

... определяет, когда будут запускаться охранники и резолверы. По умолчанию они запускаются только при изменении матричных параметров маршрута. Если установлено paramsOrQueryParamsChange, они также будут запускаться при изменении параметров запроса. А когда установлено значение always, они будут запускаться каждый раз.

Итак, при определении маршрута вы можете использовать его так:

{
   path: 'some path',
   runGuardsAndResolvers: 'paramsOrQueryParamsChange'
   ...
}

Это должно перезапустить охранников и резолверов.

person Max Koretskyi    schedule 21.07.2017
comment
Уау, никогда об этом не слышал. Прочитал официалку, думаю это именно то, что мне нужно. Я собираюсь проверить это и отредактировать свой ответ, если я смогу достичь того, чего хочу, спасибо !! - person KCarnaille; 21.07.2017
comment
Я пробовал, работает ОТЛИЧНО. Именно то, что мне нужно! Редактирую свой вопрос с твоим ответчиком. Большое спасибо - person KCarnaille; 21.07.2017