Je crée un site Web immobilier en utilisant Angular 2, Google Maps, etc. et lorsqu'un utilisateur change le centre de la carte, j'effectue une recherche dans l'API indiquant la position actuelle de la carte ainsi que le rayon. Le fait est que je veux refléter ces valeurs dans l'URL sans recharger la page entière. Est-ce possible? J'ai trouvé des solutions en utilisant AngularJS 1.x mais rien à propos d'Angular 2.
javascript
angular
routes
angular2-routing
Marcos Basualdo
la source
la source
Réponses:
Vous pouvez utiliser
location.go(url)
ce qui changera fondamentalement votre URL, sans changement de route d'application.Question connexe qui décrit
location.go
ne sera pas intime deRouter
se produire des changements.la source
import { Location } from '@angular/common';
dans Angular 4constructor(private location: Location){ }
location.go()
alors que vous auriez dû taperthis.location.go()
. Lorsque vous émettez lethis.
, vous appelez l'interface de localisation de Typescript.À partir de RC6, vous pouvez effectuer les opérations suivantes pour modifier l'URL sans changer d'état et ainsi conserver l'historique de votre itinéraire
la source
Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'some/newstate'
L'utilisation
location.go(url)
est la voie à suivre, mais au lieu de coder en dur l'URL, envisagez de la générer en utilisantrouter.createUrlTree()
.Étant donné que vous souhaitez effectuer l'appel de routeur suivant:
this.router.navigate([{param: 1}], {relativeTo: this.activatedRoute})
mais sans recharger le composant, il peut être réécrit comme:la source
this.router.createUrlTree([], {relativeTo: this.activatedRoute, queryParams: {param: 1}}).toString()
Pour quiconque comme moi trouve cette question, ce qui suit pourrait être utile.
J'ai eu un problème similaire et j'ai d'abord essayé d'utiliser location.go et location.replaceState comme suggéré dans d'autres réponses ici. Cependant, j'ai rencontré des problèmes lorsque je devais naviguer vers une autre page de l'application car la navigation était relative à l'itinéraire actuel et l'itinéraire actuel n'était pas mis à jour par location.go ou location.replaceState (le routeur ne sait rien sur ce qu'ils font à l'URL)
En substance, j'avais besoin d'une solution qui ne rechargeait pas la page / le composant lorsque le paramètre d'itinéraire était modifié, mais DID mettait à jour l'état de l'itinéraire en interne.
J'ai fini par utiliser des paramètres de requête. Vous pouvez en savoir plus ici: https://angular-2-training-book.rangle.io/handout/routing/query_params.html
Donc, si vous devez faire quelque chose comme enregistrer une commande et obtenir un identifiant de commande, vous pouvez mettre à jour l'URL de votre page comme indiqué ci-dessous. La mise à jour d'un emplacement de centre et des données associées sur une carte serait similaire
et vous en gardez une trace dans la méthode ngOnInit comme:
Si vous devez accéder directement à la page de commande avec une nouvelle commande (non enregistrée), vous pouvez faire:
Ou si vous devez accéder directement à la page de commande pour une commande existante (enregistrée), vous pouvez faire:
la source
J'ai eu du mal à faire fonctionner cela dans les versions RCx d'angular2. Le package Location a été déplacé et l'exécution de location.go () à l'intérieur de constructor () ne fonctionnera pas. Il doit être ngOnInit () ou plus tard dans le cycle de vie. Voici un exemple de code:
Voici les ressources angulaires en la matière: https://angular.io/docs/ts/latest/api/common/index/Location-class.html https://angular.io/docs/ts/latest/api/ common / index / LocationStrategy-class.html
la source
J'utilise cette façon de l'obtenir:
-- ÉDITER --
Je pense que je devrais ajouter quelques informations supplémentaires pour cela.
Si vous utilisez le
this.location.replaceState()
routeur de votre application n'est pas mis à jour, donc si vous utilisez les informations du routeur plus tard, ce n'est pas la même chose dans votre navigateur. Par exemple, si vous utilisezlocalizeService
pour changer de langue, après avoir changé de langue, votre application revient à la dernière URL où vous étiez avant de la changer avecthis.location.replaceState()
.Si vous ne voulez pas ce comportement, vous pouvez choisir une méthode différente pour mettre à jour l'URL, comme:
Dans cette option, votre navigateur ne s'actualise pas non plus, mais votre
URL
modification est également injectée dansRouter
votre application, donc lorsque vous changez de langue, vous n'avez pas de problème comme dansthis.location.replaceState()
.Bien sûr, vous pouvez choisir la méthode pour vos besoins. Le premier est plus léger car vous n'engagez pas plus votre application que le changement
URL
de navigateur.la source
Pour moi, c'était en fait un mélange des deux avec Angular 4.4.5.
L'utilisation de router.navigate a continué à détruire mon url en ne respectant pas la partie realtiveTo: enabledRoute.
J'ai fini avec:
la source
Utilisez l'attribut queryParamsHandling: 'merge' lors de la modification de l'url.
la source