3つのURL、_/:projectId/info
_、_/:projectId/users
_、_/:projectId/users/:userId/profile
_があるとします。それらはすべてparam projectId
を持っています。 UIには、あるプロジェクトから別のプロジェクトに切り替えるコンポーネントがあります。だから私は必要です:
したがって、this.router.replaceParam(currentUrl, {projectId: 'project_id_2'})
のようなものが必要です。これは_/project_id_1/users/user_id_1/profile
_を_/project_id_2/users/user_id_1/profile
_(および_:projectId
_ paramを持つ他のURL)に変換します
これは単純で一般的な問題だと思っていましたが、1時間で解決策が見つかりませんでした。推奨 here 解決策は最後のコメントで述べたように機能しません
現在のURLから特定のリンクに移動するには、次のようなことができます。
constructor(private route: ActivatedRoute, private router: Router){}
ngOnInit() {
this.route.params.subscribe(params => {
// PARAMS CHANGED ..
let id = params['projectid'];
});
}
navigate(){
this.router.navigateByUrl(this.router.url.replace(id, newProjectId));
// replace parameter of navigateByUrl function to your required url
}
NgOnInit関数では、paramsにサブスクライブしているため、urlパラメーターの変更についてステートメントを監視および実行できます。
HTMLまたはTsのいずれかを使用できます
1> HTMLで
_[routerLink]="['../info']"
Or
[routerLink]="['../users']"
like this etc....
_
2> TypeScriptで
this.router.navigate(['../users'], { relativeTo: this.activatedRoute });
あなたの質問を見て、2つのパラメータを変更したいです。
で述べたように:
https://angular.io/api/router/Router#navigatebyurl
router.navigate([yourprojectId, 'users', youruserId , 'profile'], {relativeTo: route});
を実装できます
これはあなたがそれを行うことができる一つの方法です。 urlを取得し、現在のパラメーターを取得します(それらが何であるかわからないように聞こえるので)。projectidとuseridの両方がある場合は、両方を持つパラメーターにルーティングします。 URLが'o'
で終わる場合は、/info
ルートにあり、's'
で終わる場合は/users
ルートです。
constructor(private activatedRoute: ActivatedRoute) {}
replacePrarm(projectId) {
// get current url
const url = this.router.url;
// get current params
this.activatedRoute.params.subscribe((params: Params) => {
if(params['projectId'] && params['userId']) {
router.navigate(projectId, 'users', params['userId'], 'profile'], {relativeTo: route});
} else if (url[url.length - 1] === 'o') {
router.navigate(projectId, 'info'], {relativeTo: route});
} else if (url[url.length - 1] === 's') {
router.navigate(projectId, 'users'], {relativeTo: route});
}
});
}
これは、自分がどのルートにいるのかわからないことを前提としていますが、実際には、ユーザー、情報、またはプロファイルにいるのであれば、何らかのアイデアがあるはずです。それ以外の場合は、3つの非常に異なるページに1つのコンポーネントを使用しています。
対応するコンポーネント(つまり.tsファイル)に追加する必要があります
import { Subscription } from 'rxjs/Subscription';
以下を使用して@componentを使用します
myVariable: {projectId: string, userId: string};
paramsSubscription: Subscription;
ngOnInit(){
this.myVariable = {
projectId: this.route.snapshot.params['projectId'],
// userId: this.route.snapshot.params['userId']
};
this.paramsSubscription = this.route.params
.subscribe(
(params: Params) => {
this.myVariable.projectId = params['projectId'];
// this.myVariable.userId = params['userId'];
}
);
}
そして、既存のルートを変更することに興味があるメソッド。次のメソッドからルートを変更したいとしましょう。
changeRoute(): void{
this.router.navigate(['/curentUrl',this.project_id_2, 'users/user_id_1/profile']);
}
これがあなたの助けになることを願っています
Angular 7を使用して、すべてのNavigationEnd
でルーターの現在の状態を保存するサービスを使用してこれを達成しました。その後、状態ツリーを走査し、後で使用できるパスの配列を構築できます_:projectId
_のようなパラメータを見つけて置換します。
パス配列の取得:
_constructor(private router: Router) {
this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
this.pathArray = this.getPathArray(this.router.routerState.snapshot.root);
}
}
}
getPathArray(route: ActivatedRouteSnapshot) {
let array = [];
if (route.routeConfig && route.routeConfig.path !== '') {
array.Push(route.routeConfig.path);
}
if (route.firstChild) {
array = array.concat(this.getPathArray(route.firstChild));
}
return array;
}
_
_:projectId
_の置き換え:
_replacePathArrayId(id) {
return this.pathArray.map(path => {
return path.replace(':projectId', id);
})
}
_
router.navigate(service.replacePathArrayId(id))
を使用して実際にルートを変更します。
私もこの質問の調査に何時間も費やしたので、自分の解決策も共有したいと思います。
AccountNames(この場合はprojectIds)を切り替えることができるはずのルートにカスタムデータ項目を追加しました。
const routes: Routes = [
{
path: 'expenses/:accountName',
component: ExpenseListComponent,
data: { changeAccountUrl: ['expenses', ':accountName'] },
}
];
これにより、コンポーネントがそのアイテムの存在についてactivateRouteのデータを簡単に確認できます。存在する場合は、それを使用してルートを生成できます。
もう1つの利点は、生成されたルートをより詳細に制御できることです。
これは役に立ちますか?
export class MyComponent {
constructor(private router: Router, private route: ActivatedRoute){}
public navigate(){
const projectId = getNewProjectId(route.snapshot.params['projectId']);
this.router.navigate([
projectId,
this.router.url.substring(this.router.url.indexOf('/') + 1, this.router.url.length)
]);
}
}
よりきめ細かな制御が必要な場合(基本的に、現在のURLがどのように見えるかわからない)、ルートツリーを走査して、ルート構成パスを処理してみてください。 :projectId
設定があり、ツリーのどこにいるかに基づいて、router.url
構造。
let route = activatedRoute.snapshot;
while (route) {
if (route.routeConfig && route.routeConfig.path) {
// Do something with the path
}
route = route.parent;
}
これが少し役立つことを願っています:-)
次を使用できます。
this.router.navigate(
[],
{
relativeTo: this.activatedRoute,
queryParams: {projectId: 'project_id_2'},
queryParamsHandling: "merge", // remove to replace all query params by provided
});