edit:@ actor2019の回答に基づいて、問題をより詳しく説明するために質問を更新します:
Angular UI-Router (v0.0.2)を使用して、基本状態を継承しながら、メインの「ページ」/状態間を適切に移動するようにアプリを設定しました。
Index.html:
<div ui-view></div>
base.html:
<!-- Header -->
<div>
<!-- Header markup -->
<!-- Search View -->
<div ui-view="search"></div>
</div>
<!-- Page Content view -->
<div ui-view></div>
問題はapp.jsファイルにあります。 views
パラメータをbase
状態に追加すると、すべてが機能しなくなります(100%空白ページ)。このパラメーターがないと、ページは正しくレンダリングされますが、検索ビューがありません。
app.js:
$urlRouterProvider.otherwise('/');
//
// Now set up the states
$stateProvider
.state('base', {
abstract: true,
templateUrl: 'views/base.html',
views: {
"search": {
templateUrl: "views/search.html"
}
}
})
.state('base.home', {
url: "/",
templateUrl: "views/home.html"
})
.state('base.page2', {
url: "/page2",
templateUrl: "views/page2.html"
});
この親の「基本」状態にビューを追加するにはどうすればよいですか?
UPDATE:@ actor2019の回答の問題 ここ は、状態が変化するとsearch
ビューが再初期化されることです。基本レベルからのビューを、状態の変更を通じて永続化してほしい。
ビューの使用中は、状態にコントローラーとテンプレートを指定できません。それらは相互に排他的です...
これは、「ビュー」がなく、状態にコントローラーとテンプレートがある場合、UI-Routerが「ビュー」プロパティを自動的に作成し、それらのプロパティを「空の」ビューにプルするためです...
.state('base', {
abstract: true,
templateUrl: 'views/base.html', //Can't do this
views: { // when this is there.
"search": {
templateUrl: "views/search.html"
}
}
})
代わりに:
.state('base', {
abstract: true,
views: {
"": {
templateUrl: 'views/base.html'
},
"search": {
templateUrl: "views/search.html"
}
}
})
ビューのターゲット設定がネストされたビューなどでどのように機能するかはあまり論理的ではありません。自分を1つのビューの1つのビューに完全に制限するとうまくいく場合がありますが、複数の名前付きビューで作業を開始すると、混乱を招きます...名前のないビューを上に追加すると、多くの人が迷子になります...
UI-Routerでビューが機能する方法は、UI-Routerの最悪の部分です...
あなたの例を考えると、私はあなたの抽象的な親の状態から検索ビューをターゲットにする方法を完全に確信していません...
.state('base', {
abstract: true,
views: {
"": {
templateUrl: 'views/base.html'
},
"search@base": {
templateUrl: "views/search.html"
}
}
})
それが機能するようにすることさえできるなら...あるいは、検索ビューをbase.htmlの外に移動することもできますが、それは理由でそこに追加したと思います。
全体のビューの概念が、代わりに https://github.com/dotJEM/angular-routing を作成した最大の理由です。
子の状態はhome.search
の代わりに header.search
。あなたの場合、レイアウトを保持するためにabstract
状態を書きたいかもしれません、
base.html
<div class="row-fluid">
<div class="header">
<div class="span3" ui-view="logo"></div>
<div class="span9" ui-view="menu"></div>
</div>
</div>
<div class="row-fluid">
<div class="content">
<div class="span2" ui-view="sidebar"></div>
<div class="span10" ui-view="entry"></div>
</div>
</div>
app.js内
$stateProvider
.state('base',{
abstract:true,
url:'/',
templateUrl: viewBase+'base.html'
})
.state('base.main',{
url:'',
views:{
"logo":{
templateUrl:viewBase+'main/logo.html'
},
"menu":{
templateUrl:viewBase+'main/menu.html'
},
"sidebar":{
templateUrl:viewBase+'main/sidebar.html'
},
"entry":{
templateUrl: viewBase+'main/entry.html'
}
}})
Ui-router documentation によると、アプリケーションが特定の状態にある場合、つまり状態が「アクティブ」である場合、そのすべての祖先状態も暗黙的にアクティブです。したがって、たとえば、「contacts.list」状態がアクティブである場合、「contacts.list」の親状態であるため、「contacts」状態も暗黙的にアクティブになります。子の状態は、テンプレートを親のUIビューにロードします。 documentation のセクションのセクションを見て、ネストされた状態とビューを見て、方法を完全に理解することをお勧めしますこの。
ここで提供したコードでは、検索テンプレートの親の状態はhome
ですが、
.state('header.search', {
templateUrl: "views/search.html",
controller: "SearchCtrl"
})
ビューが正しく読み込まれるためには、検索テンプレートの親の状態がheader
であることを意味します。したがって、app.jsに以下の変更を加えることで問題が解決すると思います。
app.js
$stateProvider
.state('home', {
url: "/",
views: {
'': {
templateUrl: "views/mainContent.html",
controller: "MainCtrl"
},
'header': {
templateUrl: "views/header.html"
},
'footer': {
templateUrl: "views/footer.html"
},
}
})
.state('home.search', {
views: {
'search': {
templateUrl: "views/search.html",
controller: "SearchCtrl"
}
})
.state('anotherPage', {
url: "/anotherPage",
templateUrl: "views/anotherPage.html"
});
これは私にとってはうまくいきます。
$stateProvider
.state('base', {
abstract: true,
url:'/',
templateUrl: 'views/base.html'
})
.state('base.home', {
url: "",
views: {
"search@base": {
templateUrl: "views/searchOfHome.html"
}
//content@base, contentOfHome.html
}
})
.state('base.page2', {
url: "page2",
views: {
"search@base": {
templateUrl: "views/searchOfPage2.html"
}
//content@base, contentOfPage2.html
});
'base'
がルート状態の場合、'@base'
は必要ありません。