私のプロジェクトでは、angular-ui-routerとangular-bootstrapを使用しています。
フォローユースケースを実装したい:
ユーザーが「編集」ボタンをクリックすると、UIルーターはURLを変更し、モーダルウィンドウを開きます。ブラウザの戻るボタンをクリックして戻ると、モーダルウィンドウが閉じています。
モーダルウィンドウが開かれているときにユーザーがページをリロードする場合、アプリケーションはメインのui-viewコンテナでモーダルウィンドウのコンテンツをレンダリングする必要があります。
この種馬で見ることができるこのユースケース: http://canopy.co/ (アイテムをクリックしてページをリロードしてみてください)
質問:上記の動作を実装する方法は?
これが私のjsFiddleです http://jsfiddle.net/sloot/ceWqw/3/
var app = angular.module('myApp', ['ui.router', 'ui.bootstrap'])
.config(function ($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/');
$stateProvider
.state('app', {
url: '/',
controller: 'AppCtrl',
templateUrl: '/views/app.html'
})
.state('item', {
url: '/profile',
controller: 'ItemCtrl',
templateUrl: '/views/item.html'
});
})
.controller('AppCtrl', function($scope, $modal, $state){
$scope.open = function(){
// open modal whithout changing url
$modal.open({
templateUrl: '/views/item.html'
});
// I need to open popup via $state.go or something like this
};
})
.controller('ItemCtrl', function(){});
Ui-router FAQには素晴らしい例があります。キーはonEnterパラメータを使用しています。
以下は、ui-bootstrapの$ modalサービスを使用して実行する例です。この例では、onEnter関数のみを指定しています。テンプレート、コントローラーなどはありません。したがって、本質的にモーダルが表示され、閉じられるとアイテムの状態に戻ります。モーダルが閉じたときにアプリがどの状態に遷移するかを処理するのは、あなたの責任です。
$stateProvider.state("items.add", {
url: "/add",
onEnter: function($stateParams, $state, $modal, $resource) {
$modal.open({
templateUrl: "items/add",
resolve: {
item: function() { new Item(123).get(); }
},
controller: ['$scope', 'item', function($scope, item) {
$scope.dismiss = function() {
$scope.$dismiss();
};
$scope.save = function() {
item.update().then(function() {
$scope.$close(true);
});
};
}]
}).result.finally(function() {
$state.go('^');
});
}
});
以下は、UI-RouterのGithubに関する問題で、何をしようとしているのかを説明しています。
この reply で実装を確認できます。ただし、彼らが望む効果を達成する方法は最新バージョンで修正されており、機能を維持するために古いバージョンのUI-Routerを使用しています。