J'ai les états suivants dans mon fournisseur d'état ui-router:
$urlRouterProvider.when('/parent', '/parent/child');
$stateProvider.state('parent', {
url: "/parent",
abstract: true
});
$stateProvider.state('parent.child', {
url: "/child"
});
Ce qui suit la meilleure pratique pour avoir un état enfant par défaut comme expliqué ici dans la documentation ui-router.
Cependant, lorsque j'inclus maintenant un lien dans mon document qui référence quelque part le parent avec ui-sref
, tel que <a ui-sref="parent">Link</a>
, j'obtiens toujours une erreur indiquant que je ne peux pas passer à un état abstrait. Lorsque j'entre l'URL manuellement dans la barre d'adresse et que j'appuie sur enter, tout fonctionne correctement.
Liens connexes: http://plnkr.co/edit/d3Z0tOwC3VCTPqGiB0df?p=preview
Comment combiner ui-sref
avec des états enfants par défaut?
les états abstraits ne peuvent pas être ciblés directement. Ils servent principalement de base pour construire des états d'enfants. La seule raison pour laquelle cela fonctionne bien avec l'URL est que le/parent est attrapé par le .when
Cela signifie que lorsque vous appelez un enfant en utilisant
<a ui-sref="parent.child">
l'enfant à l'intérieur du parent est chargé, ce qui signifie que le parent sera chargé en tant que couche autour de lui.
Donc, ne ciblez jamais un état abstrait lui-même. C'est comme avoir une porte dans un cadre de porte. Vous pouvez uniquement ouvrir et interagir avec la porte (enfant), mais jamais directement avec le cadre (parent). Cependant, lorsque vous interagissez avec la porte, la porte et le cadre font partie d'un système chargé.
Vous pouvez donner à l'URL une adresse vide pour qu'il ne rajoute rien à l'URL de l'état parent et soit chargé.
Voir ici pour plus d’informations: https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views#abstract-states
Si vous souhaitez utiliser la structure de nommage pratique de $state
pour les états abstraits, vous pouvez l'utiliser dans un service:
$location.path(
$state.href('app.some.abstract.state', { some: 'params' })
);
Ou ceci dans un modèle ($state
doit être disponible dans le $scope
local ou global __):
<a ng-href="{{$state.href('app.some.abstract.state', { some: 'params' })}}">...</a>
Si je le faisais régulièrement, je créerais une directive similaire à ui-sref
pour ceci, moins la limitation de l'état abstrait.