angularアプリケーションに複数のビューがあります。現在、ビューを確立するためにui.routerの$stateProvider
を使用しています。ただし、それぞれを繰り返す必要があるため、これは非常に面倒です。すべての状態でビューを繰り返すのではなく、すべての状態でデフォルトのビューを設定する方法はありますか?
$stateProvider
.state('default', {
url: '/default',
views:{
view_1: {
templateUrl: 'view1',
controller: function($scope){}
},
view_2: {
templateUrl: 'view2',
controller: function($scope){}
},
view_3: {
templateUrl: 'view3',
controller: function($scope){}
}
}
})
.state('changed_state', {
url: '/changed_state',
views:{
view_1: {
templateUrl: 'view1',
controller: function($scope){}
},
view_2: {
templateUrl: 'changed_view2',
controller: function($scope){}
},
view_3: {
templateUrl: 'view3',
controller: function($scope){}
}
}
})
すべての状態のデフォルトビューを一度だけリストし、状態が変わるたびに変化するビューだけを変更する必要があります。つまり:
.state('default', {
url: '/default',
views:{
view_1: {
templateUrl: 'view1',
controller: function($scope){}
},
view_2: {
templateUrl: 'view2',
controller: function($scope){}
},
view_3: {
templateUrl: 'view3',
controller: function($scope){}
}
}
})
.state('changed_state', {
url: '/changed_state',
views:{
view_2: {
templateUrl: 'changed_view2',
controller: function($scope){}
}
}
})
ありがとう
まさにそのことは、UI-Routerアーキテクチャにすでに存在しています。
スーパーベース状態を宣言するだけです(例:'root'
)。初期化を回避するために抽象化することもできますが、そうする必要はありません。そして、この状態はすべてのデフォルトビューを定義します。子の状態または孫の状態は、次のデフォルトのいずれかを置き換えることができます。
root
状態
.state('root', {
// url: '/default', - no url needed at all, but could be
abstract: true
views:{
'' : { templateUrl: 'layout.html'},
'view_1@root': {
templateUrl: 'view1',
controller: function($scope){}
},
'view_2@root': {
templateUrl: 'view2',
controller: function($scope){}
},
'view_3@root': {
templateUrl: 'view3',
controller: function($scope){}
}
});
上で見ることができるのは、ルート状態がindex.thml <div ui-view=""></div>
に独自のテンプレート(レイアウトテンプレート)を挿入していることです。
'' : { templateUrl: 'layout.html'},
したがって、layout.html内のすべての名前付きビューは、現在デフォルトのビューで埋めることができます。絶対名前を使用する必要があります(以下を参照) )
'view_1@root': { // this will inject into the layout.html of current root state
いくつかの興味深い点。 URLは使用しないため、すべての子状態で独自の状態を定義できます。抽象を使用します...しかし、それは必須ではありません。
子の状態-これは親から利益を得る方法です
.state('changed_state', {
parent: 'root' // this way we profit from parent
url: '/changed_state',
views:{
view_2: {
templateUrl: 'changed_view2',
controller: function($scope){}
},
// HERE all other views are unchanged
また、以下を確認してください。
そして
ネーミングをもっと理解するために'view_1@root'
(小さな引用)
舞台裏では、すべてのビューに
viewname@statename
のスキームに従った絶対名が割り当てられます。ここで、viewnameはビューディレクティブで使用される名前です。州名は州の絶対名です。例: contact.item。ビュー名を絶対構文で記述することもできます。