使用$ dialog多次打开同一个对话框

时间:2013-06-05 13:51:14

标签: angularjs angular-ui-bootstrap

我在回答“this plnkr”这个问题时创建了AngularJS - open controller in a dialog (template loaded dynamically)

所有示例应用程序都会基于模板启动一个对话框,并带有自己的控制器。对话框第一次启动时,一切都按预期工作。但是,如果我尝试重新启动对话框,在解除它后,会显示模态背景但没有对话框。在javascript控制台中,您可以看到then返回的承诺上的$dialog.open()方法会立即被调用,但不会删除背景,也不会报告错误。我完全不知所措。

可以在angular-ui bootstrap documentation page上重复打开和关闭对话框。

我哪里出错了?

HTML:

<!DOCTYPE html>
<html ng-app="plnkr">

  <head>
    <link data-require="bootstrap-css@*" data-semver="2.3.2" rel="stylesheet" href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" />
    <script data-require="angular.js@1.0.7" data-semver="1.0.7" src="http://code.angularjs.org/1.0.7/angular.min.js"></script>
    <script data-require="ui-bootstrap@0.3.0" data-semver="0.3.0" src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.3.0.min.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body>
    <div ng-view></div>
  </body>

</html>

JS:

app.controller("DemoCtl", ["$scope", "$dialog", function($scope, $dialog){
  $scope.launch = function() {
    var d = $dialog.dialog({
      backdrop: true,
      keyboard: true,
      backdropClick: true,
      templateUrl: "dialog.html",
      controller: "DialogCtl"
    });

    d.open().then(function(result) { console.log("d.open().then"); });
  };
}]);

3 个答案:

答案 0 :(得分:7)

我发现了这个问题。它与使用<a>标记打开对话框有关。单击<a>标记会导致触发位置更改。该对话框通过关闭来处理位置更改,如下所示。

  this.handleLocationChange = function() {
    self.close();
  };

我不确定为什么第一次点击<a>代码时不会发生这种情况,但肯定会在所有后续调用中发生。

您可以在此plunker中看到,如果您使用按钮,则每次都会正确打开。

希望这有帮助!我会试着弄清楚它为什么不会在第一时间破坏。

修改

位置变化实际上非常糟糕。它似乎是循环的,我认为是10个消化的最大角度。仍然不确定为什么它不会在第一次点击时进行位置更改。

答案 1 :(得分:0)

看起来如果你把“javascript:;”在href中,它适用于&lt; a&gt;标签

像这样:

<a href="javascript:;" ng-click="launch()">Open the dialog</a>

此外,&lt; a&gt;标签问题似乎与浏览器有关。

答案 2 :(得分:0)

标签确实存在问题。 Jason提到他预计角度指令会阻止位置变化。就是这样,但它需要href为空白。那个掠夺者是

<a href="javascript:;" ng-click="launch()">Open the dialog</a>

应该是

<a href="" ng-click="launch()">Open the dialog</a>

当我改变了那个效果时,一切似乎都没问题