Angularjs ui-router default child state и ui-sref
У меня в моем провайдере состояния ui-router есть следующие состояния:
$urlRouterProvider.when('/parent', '/parent/child');
$stateProvider.state('parent', {
url: "/parent",
abstract: true
});
$stateProvider.state('parent.child', {
url: "/child"
});
Что следует за наилучшей практикой наличия дочернего состояния по умолчанию, как описано здесь в документах ui-router.
Однако, когда я теперь включаю ссылку в мой документ где-то, ссылаясь на родителя с ui-sref
, например <a ui-sref="parent">Link</a>
, я всегда получаю сообщение об ошибке, что я не могу перейти к абстрактному состоянию. Когда я вводим URL-адрес вручную в адресную строку и нажимаю Enter, все работает нормально.
Связанный Plunker: http://plnkr.co/edit/d3Z0tOwC3VCTPqGiB0df?p=preview
Как я могу объединить ui-sref
с дочерними состояниями по умолчанию?
Ответы
Ответ 1
абстрактные состояния не могут быть нацелены напрямую. Они в основном служат основой для создания детских состояний. Единственная причина, по которой он отлично работает с URL-адресом, заключается в том, что /parent попадает в файл .when
Это означает, что при вызове дочернего элемента, использующего
<a ui-sref="parent.child">
ребенок внутри родителя загружается, то есть родитель будет загружен как слой вокруг него.
Итак, никогда не нацеливайтесь на абстрактное состояние. Это похоже на дверь в дверную раму. Вы можете открывать и взаимодействовать только с дверью (ребенком), но никогда не с кадром (родителем) напрямую. Однако, когда вы взаимодействуете с дверью, дверь и рама являются частью системы, которая загружается.
Вы можете дать ребенку пустой URL-адрес, чтобы он не добавлял ничего к URL-адресу родительского состояния и затем будет загружен.
См. здесь для получения дополнительной информации:
https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views#abstract-states
Ответ 2
Если вы хотите использовать $state
удобную структуру именования для абстрактных состояний, вы можете использовать это в службе:
$location.path(
$state.href('app.some.abstract.state', { some: 'params' })
);
Или это в шаблоне ($state
должно быть доступно в локальном или глобальном $scope
):
<a ng-href="{{$state.href('app.some.abstract.state', { some: 'params' })}}">...</a>
Если бы я регулярно занимался этим, я бы создал для него директиву, подобную ui-sref
, за вычетом ограничения абстрактного состояния.