同じ構造を共有する一連の URL の正しいパスを解決しようとしています。私にはパスが/:id/:areaId
あり/:id/:cityId
、これは SEO の理由から設計によって行われます。実装するときは:areaId
、(API 呼び出しを行うことによって) 存在するかどうかを知る必要があり、存在しない場合は、そこ:cityId
に移動するために存在するかどうかを確認しようとします。
私が最初に考えたのはcanActivate
、サービスを注入する必要があり、私には自然に思えたので、自分のルートでした。ガードを実装してarea
コンポーネントに適用しましたが、ここで問題が発生したのcanActivate
はfalse
、ナビゲーションが停止したためです。私は urlMatchers の使用について読んできましたが、セグメントに必要なすべての情報があるとは思いませんし、同じルートを持つ Angular 2 の異なるコンポーネントのようなものを使用してサービスを注入することは私には間違っているように思われ、直接ナビゲートしようとすると失敗しますホームを介してナビゲートするのではなく、URL に移動します。直接ナビゲートする場合、インジェクターは定義されていません。
私の質問は、ガードまたは同様のものを使用して、ガードの結果が false の場合に「次の一致する URL に移動する」ことはできますか?
参考までに、私のガードは次のようになります。
@Injectable()
export class AreaGuard implements CanActivate {
constructor(private areasService: AreasService) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const areaId= route.params['areaId'];
return this.areasService.isArea(areaId)
.then(a => {
return true;
})
.catch(e => {
console.log('Checking area', e);
return false;
});
}
}