Я создаю веб-сайт по недвижимости, используя Angular 2, Google Maps и т. Д., И когда пользователь меняет центр карты, я выполняю поиск в API, указывая текущее положение карты, а также радиус. Дело в том, что я хочу отразить эти значения в URL-адресе без перезагрузки всей страницы. Это возможно? Я нашел несколько решений с использованием AngularJS 1.x, но ничего не про Angular 2.
javascript
angular
routes
angular2-routing
Маркос Басуальдо
источник
источник
Ответы:
Вы можете использовать,
location.go(url)
который в основном изменит ваш URL-адрес без изменения маршрута приложения.Связанный с этим вопрос, который описывает
location.go
, не предполагаетRouter
изменений.источник
import { Location } from '@angular/common';
в Angular 4constructor(private location: Location){ }
location.go()
а должны были печататьthis.location.go()
. Когда вы испускаетеthis.
, вы вызываете интерфейс местоположения Typescript.Начиная с RC6, вы можете сделать следующее, чтобы изменить URL без изменения состояния и тем самым сохранить историю вашего маршрута
источник
Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'some/newstate'
Использование
location.go(url)
- это путь, но вместо жесткого кодирования URL-адреса рассмотрите возможность его создания с помощьюrouter.createUrlTree()
.Учитывая, что вы хотите выполнить следующий вызов маршрутизатора:
this.router.navigate([{param: 1}], {relativeTo: this.activatedRoute})
но без перезагрузки компонента, его можно переписать как:источник
this.router.createUrlTree([], {relativeTo: this.activatedRoute, queryParams: {param: 1}}).toString()
Для тех, кто, как я, нашел этот вопрос, может быть полезно следующее.
У меня была аналогичная проблема, и я сначала пытался использовать location.go и location.replaceState, как это предлагается в других ответах здесь. Однако у меня возникли проблемы, когда мне пришлось перейти на другую страницу в приложении, потому что навигация была относительно текущего маршрута, а текущий маршрут не обновлялся с помощью location.go или location.replaceState (маршрутизатор ничего не знает о том, что они делают с URL-адресом)
По сути, мне нужно было решение, которое НЕ перезагружало страницу / компонент при изменении параметра маршрута, но DID обновляло состояние маршрута внутри.
В итоге я использовал параметры запроса. Вы можете найти больше об этом здесь: https://angular-2-training-book.rangle.io/handout/routing/query_params.html
Поэтому, если вам нужно сделать что-то вроде сохранения заказа и получения идентификатора заказа, вы можете обновить URL своей страницы, как показано ниже. Обновление местоположения центра и связанных данных на карте будет аналогичным
и вы отслеживаете это в методе ngOnInit, например:
Если вам нужно перейти прямо на страницу заказа с новым (несохраненным) заказом, вы можете сделать:
Или, если вам нужно перейти прямо на страницу заказа для существующего (сохраненного) заказа, вы можете сделать:
источник
У меня были серьезные проблемы с тем, чтобы заставить это работать в версиях RCx angular2. Пакет Location перемещен, и выполнение location.go () внутри constructor () не будет работать. Это должно быть ngOnInit () или позже в жизненном цикле. Вот пример кода:
Вот ресурсы angular по этому вопросу: https://angular.io/docs/ts/latest/api/common/index/Location-class.html https://angular.io/docs/ts/latest/api/ общий / index / LocationStrategy-class.html
источник
Я использую такой способ получения:
-- РЕДАКТИРОВАТЬ --
Думаю, для этого мне нужно добавить еще немного информации.
Если вы используете
this.location.replaceState()
маршрутизатор, ваше приложение не обновляется, поэтому, если вы используете информацию о маршрутизаторе позже, это не равноценно этому в вашем браузере. Например, если вы используетеlocalizeService
для изменения языка, после переключения языка ваше приложение возвращается к последнему URL-адресу, где вы были до этого, измените его с помощьюthis.location.replaceState()
.Если вам не нужно такое поведение, вы можете выбрать другой метод для обновления URL, например:
В этом варианте ваш браузер также не обновляется, но ваши
URL
изменения также вводятся вRouter
ваше приложение, поэтому при переключении языка у вас не возникает проблем, как вthis.location.replaceState()
.Конечно, вы можете выбрать метод под свои нужды. Первый вариант легче, потому что вы не занимаетесь своим приложением больше, чем изменениями
URL
в браузере.источник
Для меня это была смесь того и другого с Angular 4.4.5.
Использование router.navigate продолжало уничтожать мой URL-адрес, не соблюдая часть realtiveTo: activateRoute.
Я получил:
источник
Используйте атрибут queryParamsHandling: 'merge' при изменении URL-адреса.
источник