Supposons que j'ai 3 URL: /:projectId/info
, /:projectId/users
, /:projectId/users/:userId/profile
. Tous ont param projectId
. L'interface utilisateur comporte un composant permettant de passer d'un projet à un autre. Donc j'ai besoin de:
J'ai donc besoin de quelque chose comme this.router.replaceParam(currentUrl, {projectId: 'project_id_2'})
qui transformera /project_id_1/users/user_id_1/profile
en /project_id_2/users/user_id_1/profile
(et toute autre URL avec :projectId
param)
Je pensais que c'était un problème simple et courant mais je n'ai pas trouvé de solution en 1 heure. Suggéré ici la solution ne fonctionne pas comme indiqué dans le dernier commentaire
Pour naviguer vers un lien particulier à partir de l'URL actuelle, vous pouvez faire quelque chose comme ceci,
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
}
Sur la fonction ngOnInit, nous avons souscrit à params afin de pouvoir observer et exécuter nos instructions à chaque changement de paramètre url.
C'est une façon de le faire. Récupère l'URL, récupère les paramètres actuels (parce que ça a l'air de ne pas savoir ce qu'ils sont), si vous avez à la fois projectid et userid, vous vous dirigez ensuite vers celui avec les deux. Si l'URL se termine par 'o'
, alors vous êtes sur la route /info
et si elle se termine par 's'
, il s'agit de la route /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});
}
});
}
En supposant que vous n’ayez aucune idée de la route sur laquelle vous êtes, mais en réalité, vous devriez avoir une idée de si vous êtes dans les utilisateurs, les informations ou le profil. Sinon, vous utilisez un composant pour trois pages très différentes.
En regardant votre question, vous voulez changer les 2 paramètres.
Comme indiqué dans :
https://angular.io/api/router/Router#navigatebyurl
Vous pouvez implémenter router.navigate([yourprojectId, 'users', youruserId , 'profile'], {relativeTo: route});
Dans le composant correspondant (dans le fichier .ts, par exemple), vous devez ajouter
import { Subscription } from 'rxjs/Subscription';
Déconnectez-vous de votre utilisation de @component après
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'];
}
);
}
et sur quelle méthode vous êtes intéressé pour changer de route existante
changeRoute(): void{
this.router.navigate(['/curentUrl',this.project_id_2, 'users/user_id_1/profile']);
}
espérons que cela peut vous aider
Est-ce que cela aiderait?
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)
]);
}
}
Au cas où vous auriez besoin d'un contrôle plus granulaire (en principe, vous ne savez pas à quoi devrait ressembler l'URL actuelle), essayez de parcourir l'arbre de routage, en traitant les chemins de configuration de route. Vous pouvez y trouver la configuration :projectId
et, en fonction de votre position dans l’arborescence, vous pouvez comprendre votre structure router.url
.
let route = activatedRoute.snapshot;
while (route) {
if (route.routeConfig && route.routeConfig.path) {
// Do something with the path
}
route = route.parent;
}
Espérons que cela aide un peu :-)