Angular 2+: доступ к маршруту в параметрах транзитного запроса, а не к текущему активному маршруту - PullRequest
0 голосов
/ 06 июня 2018

Проблема : Я пытаюсь получить доступ к параметрам запроса, которые проверяет охранник маршрута, а не к текущим параметрам запроса снимка URL-адреса.

ActivatedRoute показывает только текущий статус маршрута, в котором они находятся, а не тот, который находится в пути.Так что, если я нахожусь на странице «app / users / list», снимок маршрута будет «app / users / list», когда информация извлекается для защиты canActivationChild, но я пытаюсь получить доступ к ссылке, на которую они идут, а не кудаони приходят из.(это то, что предполагается делать Angular; это текущий активный снимок)

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

Сценарий : у меня есть таблица со списком пользователей, и каждый пользователь может либо перейти на панель мониторинга или на экран редактора для завершения, прежде чем войти на панель мониторинга.Поэтому, когда пользователь нажимает на пользователя из таблицы списка пользователей, средство защиты маршрута должно проверить, имеют ли пользователь определенные свойства, не равные NULL, прежде чем перейти к панели управления, и если у них есть какие-либо свойства NULL, они направляются защитником.на страницу редактора.Страница панели мониторинга защищена средством canActivationChild, которое решает, могут ли данные пользователя отображаться на этой панели, основываясь на том, есть ли у них вся доступная информация, и если нет, то перенаправляются в редактор для завершения.

 // The Link
 this.router.navigate(['/dashboard', { id: userId }])


 // The Guard
 @Injectable()
 export class CanShowUserDashboard implements CanActivateChild {

   constructor(
     private _router: Router,
     private _route: ActivatedRoute
   ) {}

   canActivateChild() {
    this._route.queryParams.subscribe((next) => {
       let queryParams = next.id;
       // queryParams is undefined
    })
   }
  }

Цель Получение параметров запроса из ссылки на панели мониторинга, а не со страницы списка текущего активного пользователя.

Единственное решение, которое я получил? Подумал о передачепользователь в службу, и иметь охрану доступа к службе, чтобы получить информацию.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Это может произойти с вами, потому что вы пытались перейти к дочернему маршруту, не сохраняя фактический параметр sain следующим образом this.router.navigate(['child-one', {id:'childparameter'}],{ relativeTo: this.route }); или из гиперссылки шаблона, такой как <a [routerLink]="['child']" [queryParams]="{ id: childparam}" > link-to-child </a>, в обоих случаях браузер уничтожит родительскую строку запроса, даже есливызов маршрута относительно фактического маршрута, для предотвращения его использования:

Для первого случая: this.router.navigate(['/parent' , { id: this.router.routerState.snapshot._root.children[0].value.url[0].parameters['id'] } ,'child' , {id:this.route.snapshot.queryParams['id']} ]);, он сохраняет самый первый параметр в некотором триоде объекта router.routerState.snapshot._root, соответствующий происхождениюсистемы маршрутизации, до последнего параметра измерения.

Для второго случая: <a [routerLink]="[{id:oldparam},'child']" [queryParams]="{ id: childparam }" > link-to-child </a> или <a [routerLink]="['.', {id:oldparam},'child']" [queryParams]="{ id: childparam }" > link-to-child </a>, где oldparam - переменная области действия, полученная в фазе перехода между маршрутами, как упомянуто в первом случае.

Обратите внимание, что я использовал _root.children[0] произвольно, вы также можете использовать _root.value.firstChild, это будет иметь тот же результат.

см. Мою скрипку здесь

Вам не нужно понимать все это, просто посмотрите на функцию CanActivateChild(), которая имеет this.route.queryParams.subcribe part.

decide(a,b){

   if(a.children[0]!==undefined){
      console.log('haschild');
      return a.value.url[0].parameters['id'];}
    else
    {
      console.log('dosnt have child');
      return b;
    }
  }

CanActivateChild () {

    console.log("decide");

    this.route.params.subscribe((next) => {
       console.log("logging parent")
       console.log( this.decide(this.router.routerState.snapshot._root.children[0],next.id));
    });
  }

Эта функция регистрирует параметры транзитивного запросаесли вызов маршрута является вложенным, или последний указанный параметр, если адрес бездетен.Который может быть указан функцией decide().

0 голосов
/ 06 июня 2018

Функция canActivateChild получает ActivatedRouteSnapshot дочернего маршрута в качестве первого параметра.

export interface CanActivateChild {
    canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean;
}

Таким образом, вы можете получить идентификатор пользователя из аргумента childRoute.

@Injectable()
export class CanShowUserDashboard implements CanActivateChild {

    canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
         // prints the value of userId
         console.log(childRoute.queryParams['id']);
    }
}
...