チュートリアルのAngularUIプロジェクトに取り組んでいます。状態、ネストされた状態、抽象状態についてすべて読みました。問題は、抽象状態を使用する理由と時期を理解できないことです。
抽象状態は、あなたが書いた状態に直接アクセスできないことを意味します。抽象状態は、子供が接続するために独自の状態を必要とします。
子の状態をロードすると呼び出されます。抽象状態を使用してページの初期パターンを定義できます。ユーザープロフィールとソーシャルページを表示したいソーシャルメディアサイトの例を取り上げてみましょう。そのため、abstract
状態を1つ持つことができます。これには、url: ""
があり、ページの基本的なレイアウトがあります。 header
、content
&footer
のような名前付きビュー。 header
&footer
名前付きビューは、抽象状態で埋められます。次に、子は、表示されるモジュールに応じてコンテンツが何であるかを定義します。 /profile
はuserProfile.html
を表示し、/social
はユーザーのソーシャルページsocial.html
を表示します。
構成
app.config(function($stateProvider){
$stateProvider.state("app":
{
url: "", //you can have the default url here..that will shown before child state url
abstract: true,
views: {
'': {
templateUrl: 'layout.html',
controller: 'mainCtrl'
},
'header': {
templateUrl: 'header.html'
},
'footer': {
templateUrl: 'footer.html'
}
},
resolve: {
getUserAuthData: function(userService){
return userService.getUserData();
}
}
})
.state("app.profile": {
'content@app': {
templateUrl: 'profile.html',
controller: 'profileController'
}
})
.state("app.social": {
'content@app': {
templateUrl: 'social.html',
controller: 'socialController'
}
})
})
abstract
のその他の主な機能は、共通の解決策があり、子の状態またはイベントリスナーで使用するデータを介して継承されたカスタムデータを提供できることです。また、OnEnter
をロードする前にOnExit
とstate
を使用して、state
からロードする前に確認することもできます。
Hit\transitionedにできる状態が必要ない場合は、それを抽象的な状態にすることができます。例
\A
\A.B
\A.B.C
ユーザーに単に\A
に移動させたくない場合は、abstract
にする必要があります。
基本的に、抽象状態は、さまざまな状態から親の抽象状態に共通の機能を移動するのに役立ちます。
典型的な例は、ユーザー名、ローカリゼーション設定、メタデータのロードを処理する状態です。ユーザーがそれだけをロードする状態にリダイレクトしないようにします。すべての状態にリダイレクトされたときに常に読み込まれるようにしたい
/session
は抽象的ですが/session/main
、/session/detail
はしません。依存関係によって、main
とdetail
の両方の状態に移行するときにセッションデータが読み込まれますが、ユーザーがsession
状態に移行することは望ましくありません。
抽象状態
いくつかの州で利用可能ないくつかの一般的な情報が必要になる状況があります。この目的のために、UI-Routerは抽象的な状態を指定する可能性を提供します。抽象状態は子状態を持つことができますが、それ自体をアクティブにしたり、遷移したりすることはできません。抽象状態は、その子状態の1つがアクティブになると暗黙的にアクティブになります。これは、次の場合に役立ちます:使用するために解決された依存関係を(解決によって)提供する必要がある、子状態が満たす独自のuiビューを持つテンプレートを挿入する必要があるすべての子状態URLにURLを付加する必要がある子状態ごとに、子状態またはイベントで使用するために継承されたカスタム状態データを提供する必要があります。抽象状態は、trueに設定された状態構成オブジェクトの抽象キーを指定して定義されます。
$stateProvider
.state('home', {
abstract: true,
templateURL: 'home.html'
})