アプリケーションに、ユーザーのリストを示すテーブルなどのリストページがあるとします。テーブルの各行には「編集」というボタンがあり、これをクリックすると、ブラウザーの右側にそのユーザーのコンテンツを編集するためのフォームを備えた右パネルが表示されます。フォームが保存されるか閉じられると、右側のパネルが消えます。
どのようにAngular UI Routerを取得して、編集状態の開始および終了時に右側のパネルを自動的に表示/非表示にしますか?デフォルトでは、テンプレートは追加および削除されますが、コンテナー自体は画面上にまだ存在します。
UIルーターのデモアプリケーションでは、htmlレイアウトにすべての子状態に割り当てられた空のスペースがありましたが、作成中のアプリケーションでは、パネルが使用されていない場合は非表示にし、画面全体を-状態が出入りするとき。これを行うには、ng-showとng-hideを使用する必要があると思います。 UIルーターでこれを行うにはどうすればよいですか?
ありがとう!
私が思いついた最良の解決策は次のようなものでした:
<div id="rightView" ng-show="$state.current.name === 'adminCompanies.list.edit'">
<div ui-view autoscroll="false"></div>
</div>
Angularのui-routerは、ネストされたビューを切り替えるためのクリーンな方法を提供します。
最初に$ stateを仮想の「リストページ」コントローラに挿入し、次にローカルの$ scope:に公開します
.controller('ListPageCtrl', function($scope, $state) {
$scope.$state = $state;
})
注入した$ state変数には、ニースの "includes"メソッドがあります。 $ state.includes()は文字列を引数として取り、その文字列を現在の状態名と照合します。状態名が文字列と一致する場合はtrueを返し、一致しない場合はfalseを返します。これにより、ng-showまたはng-hideを使用すると非常に便利です。
egervariと同じテンプレートで代わりにui-routerの$ state.includes()を使用します
<div id="rightView" ng-show="$state.includes('list.edit')">
<div ui-view="edit" autoscroll="false"></div>
</div>
Includeメソッドに切り替える以外に、一意の名前をui-view属性に追加しました。 2つ以上のビューがある場合は、ビューに名前を付けます。これにより、テンプレートとロジックで簡単に追跡できます。
ビューに名前を追加するには、1を2に変更します
// 1
.state('list.edit', {
url: 'list/edit/:id',
templateUrl: 'template/edit.html',
controller: 'ListPageEditCtrl'
})
// 2
.state('list.edit', {
url: 'list/edit/:id',
views: {
'edit': { // this is the unique name you can reference later
templateUrl: 'template/edit.html',
controller: 'ListPageEditCtrl'
}
}
});
いずれにしても、この問題を解決するには、angularアプリの.runセクションで次のように宣言するようにしてください。
angular.module('yourApp', ['ui.router'])
.run(
['$rootScope', '$state', '$stateParams',
function ($rootScope, $state, $stateParams){
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}
]
)
それ以外の場合、$ stateも$ stateParamsも内部テンプレートからアクセスできません。これが機能していなかったため、キーボードに頭をぶつけた直後に、ui-router docsを読んでサンプルアプリのコードを確認しました。
URLは、クエリ文字列/stuff/1?edit
または/stuff/1
を表す/stuff/1?view
を使用して、状態モードを反映する必要があります
reloadOnSearch=false
を使用して、AngularJSにビューをリロードしないように指示できます。
http://docs.angularjs.org/api/ngRoute.$routeProvider
controller
内で、$routeParams
を使用して状態モード(view
またはedit
)を確認します。編集クリックイベントをキャッチし、モデルをバーに渡し、それに応じて表示を切り替えます。
これらの興味深いリンクを参照してください。