使用JavaScript在AngularJS Bootstrap UI中调用模态窗口

时间:2013-04-28 17:49:27

标签: angularjs modal-dialog angular-ui-bootstrap

使用提到的here示例,如何使用JavaScript调用模态窗口而不是单击按钮?

我是AngularJS的新手,并试图在没有运气的情况下搜索文档herehere

由于

6 个答案:

答案 0 :(得分:75)

好的,首先http://angular-ui.github.io/bootstrap/有一个<modal>指令和$dialog服务,这两个服务都可以用来打开模态窗口。

不同之处在于,<modal>指令的模态内容嵌入在托管模板中(触发模态窗口打开的模板)。 $dialog服务更加灵活,允许您从单独的文件加载模态内容,以及从AngularJS代码中的任何位置触发模态窗口(这是控制器,服务或其他指令)。

不确定“使用JavaScript代码”究竟是什么意思,但假设您指的是AngularJS代码中的任何位置,$dialog服务可能是一种方法。

它非常易于使用,并且只需写出最简单的形式:

$dialog.dialog({}).open('modalContent.html');  

为了说明它可以被任何JavaScript代码真正触发,这里是一个版本,在实例化控制器3秒后触发带有计时器的模态:

function DialogDemoCtrl($scope, $timeout, $dialog){
  $timeout(function(){
    $dialog.dialog({}).open('modalContent.html');  
  }, 3000);  
}

这可以在此插件中看到:http://plnkr.co/edit/u9HHaRlHnko492WDtmRU?p=preview

最后,这里是这里描述的$dialog服务的完整参考文档: https://github.com/angular-ui/bootstrap/blob/master/src/dialog/README.md

答案 1 :(得分:29)

要使用bootstrap 3进行角度ui $模态工作,您需要覆盖样式

.modal {
    display: block;
}
.modal-body:before,
.modal-body:after {
    display: table;
    content: " ";
}
.modal-header:before,
.modal-header:after {
    display: table;
    content: " ";
}

(如果你使用自定义指令,最后一个是必要的)并用

封装html
<div class="modal-dialog">
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
      <h4 class="modal-title">Modal title</h4>
    </div>
    <div class="modal-body">
      ...
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
      <button type="button" class="btn btn-primary">Save changes</button>
    </div>
  </div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->

答案 2 :(得分:27)

打开模态窗口并将数据传递给对话框

如果有人有兴趣将数据传递给对话框:

app.controller('ModalCtrl', function($scope,  $modal) {

      $scope.name = 'theNameHasBeenPassed';

      $scope.showModal = function() {

        $scope.opts = {
        backdrop: true,
        backdropClick: true,
        dialogFade: false,
        keyboard: true,
        templateUrl : 'modalContent.html',
        controller : ModalInstanceCtrl,
        resolve: {} // empty storage
          };


        $scope.opts.resolve.item = function() {
            return angular.copy(
                                {name: $scope.name}
                          ); // pass name to resolve storage
        }

          var modalInstance = $modal.open($scope.opts);

          modalInstance.result.then(function(){
            //on ok button press 
          },function(){
            //on cancel button press
            console.log("Modal Closed");
          });
      };                   
})

var ModalInstanceCtrl = function($scope, $modalInstance, $modal, item) {

     $scope.item = item;

      $scope.ok = function () {
        $modalInstance.close();
      };

      $scope.cancel = function () {
        $modalInstance.dismiss('cancel');
      };
}

演示 Plunker

答案 3 :(得分:17)

AngularJS Bootstrap网站尚未更新最新文档。大约3个月前pkozlowski-opensource编写了一个更改,将$ modal从$ dialog commit中分离出来:

https://github.com/angular-ui/bootstrap/commit/d7a48523e437b0a94615350a59be1588dbdd86bd

在该提交中,他为$ modal添加了新文档,可以在下面找到:

https://github.com/angular-ui/bootstrap/blob/d7a48523e437b0a94615350a59be1588dbdd86bd/src/modal/docs/readme.md

希望这有帮助!

答案 4 :(得分:17)

快速而肮脏的方式!

这不是一个好方法,但对我来说似乎是最简单的。

添加一个包含模态数据目标和数据切换的锚标记,并具有与之关联的标识。 (可以在html视图中的任何地方添加)

<a href="" data-toggle="modal" data-target="#myModal" id="myModalShower"></a>

现在,

在角度控制器内部,您想要触发模态的地方只需使用

angular.element('#myModalShower').trigger('click');

这将模仿基于角度代码点击按钮,将出现模态。

答案 5 :(得分:4)

与Maxim Shoustin提供的版本相似的不同版本

我喜欢这个答案,但困扰我的部分是使用<script id="...">作为模态模板的容器。

我想将模态模板放在隐藏的<div>中,并将内部html与名为modal_html_template的范围变量绑定 主要是因为我认为将模板的html放在<div>而不是<script id="...">

中更正确(并且在WebStorm / PyCharm中处理更加舒适)

调用$modal({... 'template': $scope.modal_html_template, ...})

时将使用此变量

为了绑定内部html,我创建了inner-html-bind这是一个简单的指令

查看示例 plunker

<div ng-controller="ModalDemoCtrl">

    <div inner-html-bind inner-html="modal_html_template" class="hidden">
        <div class="modal-header">
            <h3>I'm a modal!</h3>
        </div>
        <div class="modal-body">
            <ul>
                <li ng-repeat="item in items">
                    <a ng-click="selected.item = item">{{ item }}</a>
                </li>
            </ul>
            Selected: <b>{{ selected.item }}</b>
        </div>
        <div class="modal-footer">
            <button class="btn btn-primary" ng-click="ok()">OK</button>
            <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
        </div>
    </div>

    <button class="btn" ng-click="open()">Open me!</button>
    <div ng-show="selected">Selection from a modal: {{ selected }}</div>
</div>

inner-html-bind指令:

app.directive('innerHtmlBind', function() {
  return {
    restrict: 'A',
    scope: {
      inner_html: '=innerHtml'
    },
    link: function(scope, element, attrs) {
      scope.inner_html = element.html();
    }
  }
});