Закрытие загрузочного бутстрапа Модаль из Angular Контроллер
У меня есть модальное окно, которое я использую для представления формы пользователям. Они вводят информацию и затем нажимают кнопку ng-click. Сервер обрабатывает запрос и отправляет ответ. Когда ответ будет успешным, я хочу закрыть модальное окно с контроллера. Как это можно достичь?
Модаль частично входит в другую страницу
Главная страница:
<!-- main content -->
<p>Foo</p>
<!-- angular directive -->
<foo-directive></foo-directive>
Содержание этой директивы:
<div ng-controller="FooCtrl">
<ul class="thumbnails">
<li class="span3 tile tile-white" ng-repeat="foo in model.foo">
<div>
{{foo.bar}}
</div>
<div>
({{foo.bam}})
</div>
<div>
<a data-toggle="modal" href="#myModal"><img src="{{foo.imgPath}}"></a>
</div>
</li>
</ul>
<!-- foo modal partial included by ejs -->
<% include foo_modal.ejs %>
</div>
Модальная разметка:
<div id="fooModal" class="modal hide fade in" style="display: none; ">
<div class="modal-header">
<a class="close" data-dismiss="modal">×</a>
<h3>New Device</h3>
</div>
<div class="modal-body">
<h4>Foo Modal</h4>
<div ng-controller="FooCtrl">
<form name="fooFrm">
<input id="email" type="email" class="input-medium" ng-model="fooEmail"
placeholder="Email">
<button class="btn btn-primary btn-small"
ng-click="doFoo({email:fooEmail})">Email Link</button>
</form>
</div>
</div>
<div class="modal-footer">
<a href="#" class="btn" data-dismiss="modal">Close</a>
</div>
</div>
Код контроллера:
functionFooCtrl($scope, FooService) {
$scope.doFoo= function (email) {
FooService.save({email:email.fooEmail}) {
alert('Request successful');
//TODO close Twitter bootstrap modal named fooModal here
},
function (err) {
alert('Your request bonked, sorry');
//TODO close twitter bootstrap modal named fooModal here
});
}
};
Каков правильный способ закрыть модальный контроллер с помощью функций успеха и ошибок?
Спасибо заранее,
Ответы
Ответ 1
Вы просмотрели angular -ui bootstrap? Там директива Dialog (ui.bootstrap.dialog) работает очень хорошо. Вы можете закрыть диалоговое окно во время вызова метода angular (в примере):
$scope.close = function(result){
dialog.close(result);
};
Update:
Директива с тех пор была переименована в Modal.
Ответ 2
Мы можем добиться того же, не используя angular -ui. Это можно сделать с помощью директив angular.
Сначала добавьте директиву в модальный.
<div class="modal fade" my-modal ....>...</div>
Создайте новую директиву angular:
app.directive('myModal', function() {
return {
restrict: 'A',
link: function(scope, element, attr) {
scope.dismiss = function() {
element.modal('hide');
};
}
}
});
Теперь вызовите метод reject() из вашего контроллера.
app.controller('MyCtrl', function($scope, $http) {
// You can call dismiss() here
$scope.dismiss();
});
Я все еще в свои ранние дни с angular js. Я знаю, что мы не должны манипулировать DOM внутри контроллеров. Поэтому у меня есть манипуляция DOM в директиве. Я не уверен, что это одинаково плохо. Если у меня будет лучшая альтернатива, я отправлю ее здесь.
Важно отметить, что мы не можем просто использовать ng-hide или ng-show в представлении, чтобы скрыть или показать модальный. Это просто скрывает модальный, а не модальный фон. Мы должны вызвать метод modal(), чтобы полностью удалить модальный.
Ответ 3
Вы можете сделать это следующим образом:
angular.element('#modal').modal('hide');
Ответ 4
Здесь можно использовать многократно используемую директиву Angular, которая скроет и покажет модальность Bootstrap.
app.directive("modalShow", function () {
return {
restrict: "A",
scope: {
modalVisible: "="
},
link: function (scope, element, attrs) {
//Hide or show the modal
scope.showModal = function (visible) {
if (visible)
{
element.modal("show");
}
else
{
element.modal("hide");
}
}
//Check to see if the modal-visible attribute exists
if (!attrs.modalVisible)
{
//The attribute isn't defined, show the modal by default
scope.showModal(true);
}
else
{
//Watch for changes to the modal-visible attribute
scope.$watch("modalVisible", function (newValue, oldValue) {
scope.showModal(newValue);
});
//Update the visible value when the dialog is closed through UI actions (Ok, cancel, etc.)
element.bind("hide.bs.modal", function () {
scope.modalVisible = false;
if (!scope.$$phase && !scope.$root.$$phase)
scope.$apply();
});
}
}
};
});
Пример использования # 1 - предполагается, что вы хотите показать модальный - вы можете добавить ng-if в качестве условия
<div modal-show class="modal fade"> ...bootstrap modal... </div>
Пример использования # 2 - это выражение Angular в атрибуте модального видимости
<div modal-show modal-visible="showDialog" class="modal fade"> ...bootstrap modal... </div>
Другой пример: для демонстрации взаимодействия с контроллером вы можете добавить что-то вроде этого к контроллеру, и он покажет модальный через 2 секунды, а затем спрячет его через 5 секунд.
$scope.showDialog = false;
$timeout(function () { $scope.showDialog = true; }, 2000)
$timeout(function () { $scope.showDialog = false; }, 5000)
Я опаздываю, чтобы внести свой вклад в этот вопрос, - создал эту директиву для другого вопроса здесь. Простая Angular Директива для Модификации Bootstrap
Надеюсь, что это поможет.
Ответ 5
Вы можете добавить data-reject = "modal" к вашим атрибутам кнопок, которые вызывают функцию angularjs funtion.
Например,
<button type="button" class="btn btn-default" data-dismiss="modal">Send Form</button>
Ответ 6
Я ремикнул ответ @isubuz и этот ответ @Umur Kontacı по директивам атрибутов в версию, где ваш контроллер не вызывает операцию типа DOM, например "увольнять", но вместо этого пытается быть более MVVM-стилем, устанавливая логическое свойство isInEditMode
. Представление, в свою очередь, связывает этот бит информации с директивой атрибута, которая открывает/закрывает мода загрузки.
var app = angular.module('myApp', []);
app.directive('myModal', function() {
return {
restrict: 'A',
scope: { myModalIsOpen: '=' },
link: function(scope, element, attr) {
scope.$watch(
function() { return scope.myModalIsOpen; },
function() { element.modal(scope.myModalIsOpen ? 'show' : 'hide'); }
);
}
}
});
app.controller('MyCtrl', function($scope) {
$scope.isInEditMode = false;
$scope.toggleEditMode = function() {
$scope.isInEditMode = !$scope.isInEditMode;
};
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet"/>
<div ng-app="myApp" ng-controller="MyCtrl as vm">
<div class="modal fade" my-modal my-modal-is-open="isInEditMode">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-body">
Modal body! IsInEditMode == {{isInEditMode}}
</div>
<div class="modal-footer">
<button class="btn" ng-click="toggleEditMode()">Close</button>
</div>
</div>
</div>
</div>
<p><button class="btn" ng-click="toggleEditMode()">Toggle Edit Mode</button></p>
<pre>isInEditMode == {{isInEditMode}}</pre>
</div>
Ответ 7
**just fire bootstrap modal close button click event**
var app = angular.module('myApp', []);
app.controller('myCtrl',function($scope,$http){
$('#btnClose').click();// this is bootstrap modal close button id that fire click event
})
--------------------------------------------------------------------------------
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
</div>
<div class="modal-body">
<p>Some text in the modal.</p>
</div>
<div class="modal-footer">
<button type="button" id="btnClose" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
просто установите modal 'close button' id, когда я установил btnClose, для закрытия модального значения в angular вам нужно просто запустить это закрытие события нажатия кнопки, как я сделал $('# btnClose'). click()
Ответ 8
Вы можете сделать это с помощью простого кода jquery.
$('#Mymodal').modal('hide');