私のui-router状態プロバイダーに次の状態があります。
$urlRouterProvider.when('/parent', '/parent/child');
$stateProvider.state('parent', {
url: "/parent",
abstract: true
});
$stateProvider.state('parent.child', {
url: "/child"
});
これは、ui-routerのドキュメントで説明されている here のように、デフォルトの子の状態を持つためのベストプラクティスに従います。
ただし、ui-sref
などの<a ui-sref="parent">Link</a>
で親を参照しているドキュメントのどこかにリンクを含めると、抽象状態に移行できないことを示すエラーが常に表示されます。アドレスバーに手動でURLを入力してEnterキーを押すと、すべてが正常に機能します。
関連プランカー: http://plnkr.co/edit/d3Z0tOwC3VCTPqGiB0df?p=preview
ui-sref
をデフォルトの子の状態と組み合わせるにはどうすればよいですか?
抽象状態を直接ターゲットにすることはできません。彼らは主に子供国家を築くための基盤として機能します。 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
$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
に似たディレクティブを作成しますが、抽象状態の制限はありません。