Angular2 Pending change guard, необходимо игнорировать определенные параметры маршрута при повторном переходе к текущему маршруту

У меня есть ожидающий изменения охранник, например

    import {CanDeactivate} from '@angular/router';

export interface ComponentCanDeactivate {
  canDeactivate: () => boolean | Observable<boolean>;
}

export class PendingChangesGuard implements CanDeactivate<ComponentCanDeactivate> {
  canDeactivate(component: ComponentCanDeactivate): boolean | Observable<boolean> {
    // if there are no pending changes, just allow deactivation; else confirm first
    return component.canDeactivate() ?
      true :
      // NOTE: this warning message will only be shown when navigating elsewhere within your angular app;
      // when navigating away from your angular app, the browser will show a generic warning message
      // see http://stackoverflow.com/a/42207299/7307355
      confirm('WARNING: You have unsaved changes. Press Cancel to go back and save these changes, or OK to lose these changes.');
  }
}

Моя проблема в том, что у меня также есть некоторые элементы управления вкладками, которые привязаны к параметрам маршрута страницы, поэтому при переходе по вкладке обновляются параметры маршрута и наоборот. Он обновил параметр, перейдя к текущему маршруту с новым параметром, который не перезагружает компонент, поскольку это все еще текущий маршрут. Моя проблема в том, что я не хочу, чтобы эти изменения маршрута считались деактивацией PendingChangesGuard, поскольку компонент все еще находится на странице в другой вкладке.

В идеале я мог бы передать некоторые параметры охраннику, сообщая ему, какие параметры маршрута следует игнорировать в случае повторного перехода к текущему маршруту, а затем каким-то образом обнаруживать внутри охранника, если единственные изменения - это один из игнорируемых параметров . Я не уверен, как обнаружить изменения в таких параметрах и идеях?


person Josh    schedule 28.04.2017    source источник
comment
у вас есть доступ к параметрам маршрута в canDeactivate, вы можете использовать его напрямую для построения вашей логики canDeactivate (компонент: ComponentCanDeactivate, route: ActivatedRouteSnapshot, состояние: RouterStateSnapshot).   -  person Madhu Ranjan    schedule 28.04.2017
comment
Я знаю об этом, но как я могу посмотреть предыдущий и текущий маршруты и выяснить, какие параметры изменились?   -  person Josh    schedule 28.04.2017


Ответы (1)


Вы можете использовать параметры запроса вместо параметров маршрута. Параметры запроса не вызывают повторного запуска охранников. Это не единственное различие между параметрами запроса и параметрами маршрута (или параметрами матрицы, или как там они называются), но это заставляет задуматься о них. Угловой маршрутизатор довольно самоуверенный, поэтому вы никогда не найдете элегантного решения.

Параметры запроса:

this.router.navigate([], {
  queryParams: {'tab': whatever}
});

or

<a [routerLink]="[]" [queryParams]="{'tab': whatever}">tab</a>
person dbandstra    schedule 09.05.2017
comment
Спасибо! Я думал об использовании строк запроса, но в прошлом у меня были проблемы с их очисткой при выгрузке компонентов и в конечном итоге с потерянными строками запроса или проблемами со временем, когда новый маршрут добавляет строку запроса, а выгруженный маршрут очищает ее querystrings, и они мешают. По крайней мере, в этом отношении параметры маршрута упрощают работу. - person Josh; 10.05.2017
comment
Я помню что-то подобное год назад или около того, когда «сохранение» параметров запроса при переходах было поведением по умолчанию (теперь это уже не так). Ты об этом говоришь? Конечно, если у вас есть несколько маршрутов, использующих параметры запроса одновременно, это плохая идея. Я использую параметры запроса для вкладок и ничего больше. - person dbandstra; 10.05.2017