AngularJS bootstrap.ui 模态未显示

Posted

技术标签:

【中文标题】AngularJS bootstrap.ui 模态未显示【英文标题】:AngularJS bootstrap.ui modal not showing 【发布时间】:2013-12-13 20:31:18 【问题描述】:

我正在尝试使用 AngularJS bootstrap.ui 显示一个模式对话框。当我执行 $modal.open(...) 时,屏幕变灰,并且我的 templateUrl 中的 html 从服务器被调用,但没有模式显示。当我点击灰色区域时,模态“关闭”,即灰色区域消失,屏幕恢复正常。我无法弄清楚为什么我没有看到任何模式屏幕。

我正在尝试遵循本教程: Angular directives

我正在使用 Visual Studio 2013、MVC 5、AngularJS 1.2.2。

我正在使用 VS 项目附带的 bootstrap.css。它有模态类。我没有从 javascript 控制台报告任何错误。我的应用定义如下:

var blogApp = angular.module('blogApp', ['ngResource', 'ngSanitize', 'ui.bootstrap']) ...

blogApp.controller('blogController',
function blogController($scope, $modal, $log, blogData, userData) 

    ...

    $scope.showPrivacy = function() 
        $modal.open(
            templateUrl: '/Privacy',
            controller: 'PrivacyInstanceController'
        );
        return false;
    ;
);


var PrivacyInstanceController = function($scope, $modalInstance) 
    $scope.close = function() 
        $modalInstance.close();
    ;

我的标记是:

<div ng-controller="blogController">
        <a ng-click="showPrivacy()">Privacy Policy</a>
    </div>

知道为什么我的屏幕变灰,/Privacy 资源正在加载,单击灰色时屏幕恢复正常,但没有出现模式?

【问题讨论】:

我怀疑您使用的是 Bootstrap3 CSS,并且当前发布版本仅与 Bootstrap 2.3 兼容。如果你想在 Bootstrap3 中使用这个库,你需要在你身边构建 bootstrap3 分支(直到它被正式发布和支持)。 【参考方案1】:

之前有完全相同的症状。不记得确切的细节,但我认为主要问题是模态的实例总是display:none

    确保您使用的是带有模板 (ui-bootstrap-tpls.js) 的 ui-bootstrap,因为您可能会这样做。 在ui-bootstrap-tpls.js 中,转到最底部的modal 模板(您可以通过“template/modal/window.html”找到它)并在那里添加style="display:block". If it will not help try to match css classes of the template against yourbootstrap.css`。

我个人使用了一些自定义版本的bootstrap3,现在已经将这些作为模板:

angular.module("template/modal/backdrop.html", []).run(["$templateCache", function($templateCache) 
  $templateCache.put("template/modal/backdrop.html",
    "<div class=\"modal-backdrop fade\" ng-class=\"in: animate\" ng-style=\"'z-index': 1040 + index*10\" ng-click=\"close($event)\"></div>");
]);

angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) 
  $templateCache.put("template/modal/window.html",
    "<div class=\"modal fade  windowClass \" ng-class=\"in: animate\" style='display:block;z-index:1050'  ng-transclude></div>");
]);

EDIT 您可以轻松地从 bootstrap.css 中删除 modal(及其子类)中的所有样式,其中 display 设置为 none -- bootstrap 只是隐藏 DOM 元素,而 ui-bootstrap 将其完全移除。

【讨论】:

当我检查 DOM 时,我可以看到没有显示。当我手动删除显示元素时,文本出现在背景中。我尝试更改模板/modal/window.html 以匹配您在此处的内容,但这并没有改变显示。 @Steve 所以你也必须改变你的css...(我不记得我到底做了什么——但至少你现在知道出了什么问题) @Steve 你使用什么版本的引导程序? (顺便说一句。我编辑了我的答案) 感谢您帮助我。 bootstrap.css 为 3.0.2,bootstrap.tpls.js 为 .0.7.0。我已经编辑了 .js 和 .css ,现在当模式打开时,它占据了整个屏幕并且是透明的,与它背后的东西融合在一起。我发布了我的测试站点,如果您想单击隐私政策并查看问题。 stevesdevbox.azurewebsites.net @Steve 看着它。尝试像这样改进模板的结构:&lt;div class="modal-dialog"&gt; &lt;div class="modal-content"&gt; &lt;div class="modal-header"&gt; ...【参考方案2】:

这与 ui.bootstrap 和 bootstrap 3.0 不兼容。

你只需要放入你的css:

.modal 
display: block;

您可以查看此帖子了解更多详情:AngularJs with UI-Bootstrap: Fix broken dialog boxes。

【讨论】:

【参考方案3】:

由于某种奇怪的原因,模态的背景高度没有设置为填充窗口,为了在ui-bootstrap-tpls.js 中解决这个问题,我去了底部的template/modal/backdrop.html 行并将以下内容添加到样式选项'width':'100%', 'height':'100%'

【讨论】:

【参考方案4】:

我升级到 bootstrap v3.3.4,现在它对我有用。

Angularjs v1.3.12 ui-bootstrap-0.12.0 ui.bootstrap.tpls-0.12.0

【讨论】:

【参考方案5】:

我遇到了完全相同的问题。我所做的修复它是更改我的 template.html 中的内容,该 .html 与 open-function 中的 templateUrl 属性一起提供。

我在那里有完整的模态标记:

<div class="modal fade" tabindex="-1" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content">And here some modal markup</div></div></div>

当我删除前三个 div 并且在 template.html 中只剩下 And here some modal markup 时,它工作正常!

【讨论】:

对我来说,我只需要删除第一个 div(模态淡入淡出)并保留 modal-dialog 和 modal-content,然后它就为我工作了。【参考方案6】:

在我的情况下,问题是 bower 正在安装 bootstrap 4 并且 ui-modal 支持 3.3.7,因此您需要检查 bower_components 上的 bootstrap 版本

【讨论】:

【参考方案7】:

我的问题(使用 bootstrap 4 使用 Visual Studio 进行开发)是引导类 .fade:not(.show) 定义了 opacity: 0。使用代码检查器禁用此类,我可以看到模式会显示。

但是,为了避免修改供应商文件(即bootstrap.css 文件),我只是扩展了调用模态的函数以将“显示”类添加到模态页面。在您的示例中,如下所示:

$scope.showPrivacy = function() 
    $modal.open(
        templateUrl: '/Privacy',
        windowClass: 'show',
        controller: 'PrivacyInstanceController'
    );
    return false;
;

通常,将 show 类添加到整个窗口意味着模态将连续显示。当页面动态加载时,这不是问题,因为当用户点击离开模式时,带有.show 类的整个元素都会被删除,而不管这个类是否存在。

【讨论】:

为什么这不是答案?

以上是关于AngularJS bootstrap.ui 模态未显示的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS - 可以 ng-show/ng-hide 模式窗口吗?

更改 ng-bootstrap UI 中的模态大小(角度 2)

如何只用AngularJs实现图片滑动切换?

从 angularjs 模态对话服务返回数据

AngularJS 1.5 绑定和编译 html 到模态

带有 AngularJs 的 Ionic 框架:模态是不是可以与启动模态的视图具有相同的控制器?