AngularJS - Лучший способ обновить параметр $route
У меня есть несколько маршрутов, которые отличаются друг от друга, но содержат аналогичные параметры.
Пример:
when '/user/:accountId/charts/:chartType', controller:ChartsController
when '/manager/:accountId/charts/:chartType', controller:ChartsController
when '/whatever/pathy/paththingy/charts/:chartType', controller:ChartsController
Обратите внимание, что все три представления используют один и тот же контроллер диаграмм для управления представлением. Его довольно общий контроллер, но ему нужно переключаться между доступными диаграммами, сохраняя при этом остальную часть маршрута.
Пример: (ЭТО НЕ РАБОТАЕТ)
if my currrent url is '/user/001/charts/comparison'
Then I call something like:
$route.current.params.chartType = 'newChart';
$route.reload(); // or soemthing similar?
I want the url to become '/user/001/charts/newChart'
Кто-нибудь знает, как легко обновлять параметры маршрута без полного повторного набора или восстановления пути маршрута?
Ответы
Ответ 1
Если возможно, я рекомендовал бы вместо этого использовать ui-router. Он более мощный, чем ngRoute во многих аспектах.
По существу, этот модуль имеет концепцию более высокого уровня, называемую state, которая обертывает базовый маршрут, который защищает вас от прямой работы с более низким уровнем маршрута, таким как URL-адреса маршрута.
Для сравнения: В чем разница между angular -route и angular -ui-router?
С ui-router вы можете реализовать свой код следующим образом:
$stateProvider
.state('user.chart', {
url: '/user/:accountId/charts/:chartType',
controller: "ChartsController"
})
.state('manager.chart', {
url: '/manager/:accountId/charts/:chartType',
controller: "ChartsController"
})
.state('pathy.chart', {
url: '/whatever/pathy/paththingy/charts/:chartType',
controller: "ChartsController"
})
И вы можете просто использовать этот код для навигации между состояниями:
$state.go('user.chart',{chartType:'newChart'},{inherit:true});
Документация
Ответ 2
С angular 1.3 вы можете использовать $route.updateParams(newParams)
для изменения параметров маршрута.
Вот цитата из angular docs...
$route.updateParams(newParams);
Вызывает службу $route
для обновления текущего URL-адреса, заменяя текущие параметры маршрута на указанные в newParams
. Предоставляемые имена свойств, соответствующие пути маршрута сегментные определения будут интерполированы в путь местоположения, в то время как остальные свойства будут обрабатываться как параметры запроса.
Ответ 3
Отсутствие этой простой функции меня раздражало, поэтому я Реализовал ее и подал PR на GitHub
Ответ 4
Прочитайте документы angular $location.search()
Учитывая, что ваш url - запрос на получение, и имеет некоторые параметры
Вы можете получить параметры в своем URL-адресе, используя этот метод
/user/001/charts/?chartType=comparison
var searchObject = $location.search();
// => { chartType : 'comparison' }
Теперь измените значение chartType
$location.search('chartType', 'newChart');
Это изменит параметр в вашем URL-адресе на
/user/001/charts/?chartType=newChart