Angular UI bootstrap modal dialog を使用して、サービス内で作成します:
_myApp.factory('ModalService', ['$modal', function($modal) {
return {
trigger: function(template) {
$modal.open({
templateUrl: template,
size: 'lg',
controller: function($scope, $modalInstance) {
$scope.ok = function() {
$modalInstance.close($scope.selected.item);
};
$scope.cancel = function() {
$modalInstance.dismiss('cancel');
};
}
});
},
close: function() {
// this should close all modal instances
}
};
}]);
_
コントローラーまたはその他からModalService.close()
を呼び出すときに、すべてのモーダルインスタンスを閉じるにはどうすればよいですか?
_$modalStack
_サービスを挿入し、関数$modalStack.dismissAll()
を呼び出します。詳細については、 GitHub のコードを参照してください。
_myApp.factory('ModalService', ['$modal', '$modalStack' function($modal, $modalStack) {
return {
trigger: function(template) {
$modal.open({
templateUrl: template,
size: 'lg',
controller: function($scope, $modalInstance) {
$scope.ok = function() {
$modalInstance.close($scope.selected.item);
};
$scope.cancel = function() {
$modalInstance.dismiss('cancel');
};
}
});
},
close: function(reason) {
$modalStack.dismissAll(reason);
}
};
}]);
_
ブラウザの戻るボタンのルーティングとポップアップの終了を防ぐために、次の行を追加しました。 $ modalStackをangularコントローラーに挿入する必要があります。
event.preventDefault();
$modalStack.dismissAll('close');
これは、工場や追加のコードを使用せずに私のプロジェクトで動作させる方法です。
_ //hide any open $mdDialog modals
angular.element('.modal-dialog').hide();
//hide any open bootstrap modals
angular.element('.inmodal').hide();
//hide any sweet alert modals
angular.element('.sweet-alert').hide();
_
$rootScope.$emit('logout');
としてログアウトを発行するタイムアウト関数があり、私のサービスのリスナーは次のとおりです。
_$rootScope.$on('logout', function () {
//hide any open $mdDialog modals
angular.element('.modal-dialog').hide();
//hide any open bootstrap modals
angular.element('.inmodal').hide();
//hide any sweet alert modals
angular.element('.sweet-alert').hide();
//do something else here
});
_
これが正しいアプローチであるかどうかはわかりませんが、私にとってはうまくいきます。
他の場所で同様の質問でこの問題を解決しました。絶対に行く価値があると思います。