В настоящее время наш проект использует значение по умолчанию $routeProvider
, и я использую этот «хак», чтобы изменить url
без перезагрузки страницы:
services.service('$locationEx', ['$location', '$route', '$rootScope', function($location, $route, $rootScope) {
$location.skipReload = function () {
var lastRoute = $route.current;
var un = $rootScope.$on('$locationChangeSuccess', function () {
$route.current = lastRoute;
un();
});
return $location;
};
return $location;
}]);
И в controller
$locationEx.skipReload().path("/category/" + $scope.model.id).replace();
Я думаю о замене routeProvider
на ui-router
для маршрутов вложения, но не могу найти это в ui-router
.
Возможно ли - проделать то же самое с angular-ui-router
?
Зачем мне это? Позвольте мне объяснить на примере:
маршрут для создания новой категории находится /category/new
после того, как clicking
на SAVE я показываю, success-alert
и я хочу изменить маршрут /category/new
на /caterogy/23
(23 - это идентификатор нового элемента, хранящегося в db)
angularjs
angular-ui-router
vuliad
источник
источник
$urlRouterProvider.otherwise
похоже, работает с URL-адресом, а не с состоянием. Хммм, может быть, я смогу жить с двумя URL-адресами или найти другой способ указать, что это недопустимый URL-адрес.Ответы:
Просто можешь использовать
$state.transitionTo
вместо$state.go
.$state.go
вызывает$state.transitionTo
внутренне, но автоматически устанавливает параметры на{ location: true, inherit: true, relative: $state.$current, notify: true }
. Вы можете позвонить$state.transitionTo
и установитьnotify: false
. Например:можно заменить на
Изменить: как было предложено fracz, это может быть просто:
источник
$state.transitionTo('.detail', {id: newId}, { location: true, inherit: true, relative: $state.$current, notify: false })
поэтому в основном установите для notify значение false, а для местоположения - значение true$state.go('.detail', {id: newId}, {notify: false})
.Хорошо, решено :) В Angular UI Router есть новый метод $ urlRouterProvider.deferIntercept () https://github.com/angular-ui/ui-router/issues/64
в основном это сводится к следующему:
Я думаю, что этот метод в настоящее время включен только в основную версию маршрутизатора angular ui, с дополнительными параметрами (которые тоже хороши, кстати). Его нужно клонировать и собрать из исходного кода с помощью
Документы также доступны из источника через
(они встроены в каталог / site) // подробнее в README.MD
Кажется, есть другой способ сделать это с помощью динамических параметров (которые я не использовал). Большое спасибо nateabele.
В качестве примечания, вот необязательные параметры в $ stateProvider Angular UI Router, которые я использовал в сочетании с приведенным выше:
что это делает, это позволяет разрешить состояние, даже если один из параметров отсутствует. SEO - одна цель, удобочитаемость - другая.
В приведенном выше примере я хотел, чтобы DoorSingle был обязательным параметром. Непонятно, как их определить. Однако он работает нормально с несколькими необязательными параметрами, так что это не проблема. Обсуждение здесь https://github.com/angular-ui/ui-router/pull/1032#issuecomment-49196090
источник
Error: Both params and url specicified in state 'state'
, Он говорит , что в документации , что является недопустимым использование слишком. Немного разочаровывает.Потратив много времени на эту проблему, вот что у меня получилось
источник
ui-router
только для того, как вы можете сказать, что другие решения работали$routerProvider
,$routeProvider
и$stateProvider
совершенно другие по архитектуре ..$onInit()
мой компонент вызывается каждый раз, когда я использую$state.go
. Мне это не кажется на 100% нормальным.призвание
все равно перезагрузит контроллер.
Чтобы этого избежать, нужно объявить параметр как динамический:
Тогда вам даже не нужно
notify
, просто позвонитедостаточно. Neato!
Из документации :
источник
Эта установка решила для меня следующие проблемы:
.../
на.../123
Конфигурация состояния
Вызов состояний (из любого другого контроллера)
Контроллер обучения
источник
Если вам нужно только изменить URL-адрес, но предотвратить изменение состояния:
Измените местоположение с помощью (добавьте .replace, если вы хотите заменить в истории):
Предотвратить перенаправление в ваше состояние:
источник
Я сделал это, но давно, в версии: v0.2.10 UI-router примерно так:
источник
Попробуйте что-то вроде этого
источник
Думаю, для этого вообще не нужен ui-router. В документации, доступной для службы $ location, в первом абзаце сказано: «... изменения $ location отражаются в адресной строке браузера». Позже он продолжает говорить: «Чего он не делает? Он не вызывает полной перезагрузки страницы при изменении URL-адреса браузера».
Итак, имея это в виду, почему бы просто не изменить $ location.path (поскольку метод является одновременно геттером и сеттером) примерно следующим образом:
В документации отмечается, что путь всегда должен начинаться с косой черты, но это добавит ее, если она отсутствует.
источник
ui-router
и использую$location.path(URL_PATH)
, страница автоматически перерисовывается ?!