我有一个模态窗口,用于向用户显示表单。他们输入信息,然后按下按钮点击按钮。服务器处理请求并发回响应。当响应成功时,我想从控制器关闭模态窗口。如何实现这一目标?
模态是部分包含在另一页
中主页:
<!-- 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
});
}
};
在成功和错误函数中从控制器关闭模态的正确方法是什么?
提前致谢,
答案 0 :(得分:50)
我们可以在不使用angular-ui的情况下实现相同的目标。这可以使用角度指令完成。
首先将指令添加到模态。
<div class="modal fade" my-modal ....>...</div>
创建一个新的角度指令:
app.directive('myModal', function() {
return {
restrict: 'A',
link: function(scope, element, attr) {
scope.dismiss = function() {
element.modal('hide');
};
}
}
});
现在从你的控制器调用dismiss()方法。
app.controller('MyCtrl', function($scope, $http) {
// You can call dismiss() here
$scope.dismiss();
});
我仍处于早期的角度js。我知道我们不应该操纵控制器内的DOM。所以我在指令中有DOM操作。我不确定这是否同样糟糕。如果我有更好的选择,我会在这里发布。
需要注意的重要一点是,我们不能简单地在视图中使用ng-hide或ng-show来隐藏或显示模态。这只是隐藏模态而不是模态背景。我们必须调用modal()实例方法来完全删除模态。
答案 1 :(得分:33)
你可以这样做:
angular.element('#modal').modal('hide');
答案 2 :(得分:22)
你看过angular-ui bootstrap了吗?有一个Dialog(ui.bootstrap.dialog)指令,效果很好。您可以在回调角度方式期间关闭对话框(根据示例):
$scope.close = function(result){
dialog.close(result);
};
更新
该指令后来被重命名为Modal。
答案 3 :(得分:5)
这是一个可重用的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)
我迟迟没有为这个问题做出贡献 - 在这里为另一个问题创建了这个指令。 Simple Angular Directive for Bootstrap Modal
希望这有帮助。
答案 4 :(得分:1)
你可以添加data-dismiss =&#34; modal&#34;你的按钮属性调用angularjs功能。
如;
<button type="button" class="btn btn-default" data-dismiss="modal">Send Form</button>
答案 5 :(得分:0)
我已将the answer by @isubuz和this answer by @Umur Kontacı on attribute directives混合到一个版本中,在这个版本中,您的控制器不会调用类似DOM的操作,例如&#34; dismiss&#34;,而是尝试更多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;
};
});
&#13;
<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>
&#13;
答案 6 :(得分:-1)
body
只需设置模态'关闭按钮'ID,因为我设置了btnClose,关闭角度模式你必须触发关闭按钮点击事件,因为我做$('#btnClose')。click()
答案 7 :(得分:-3)
您可以使用简单的jquery代码来完成。
$('#Mymodal').modal('hide');