【问题标题】:Dynamically Load Bootstrap Modal Content and Open It Using Angular.js动态加载引导模式内容并使用 Angular.js 打开它
【发布时间】:2021-04-05 14:34:36
【问题描述】:

我正在尝试动态加载模态内容并在用户单击按钮时将其打开。我已经设法使用 ngInclude 动态加载内容,但之后我无法打开它。我的代码:

<div class="modal-container" id="modal-container" ng-include="modal_template"></div>

还有我的controller.js

function set_modal_template(templateName, callback) {
    $scope.modal_template = templateName;
    callback();
}

$scope.load_modal_sms = function () {
    set_modal_template("/static/partials/modal_template.html", function() {
        $('#modal').modal('show');
    });
};

还有我的 modal_template.html:

<div class="modal fade" id="modal" role="dialog">
    <div class="modal-dialog" modal-sm>
        <div class="modal-content">
            <div class="modal-header">
                <h4>Pop-up head. Email</h4>
            </div>
            <div class="modal-body">
                <h4>Pop-up body.</h4>
            </div>
            <div class="modal-footer">
                <button class="btn btn-primary">Save</button>
            </div>
        </div>
    </div>
</div>

发生的情况是 modal_content.html 的内容完美加载,但模式没有显示。如果我再次单击,我只看到模态背后的透明黑色层,使屏幕变黑,但看不到模态本身。

谢谢!

【问题讨论】:

  • 对于带有引导组件的 agular js,我建议你使用angular-ui.github.io/bootstrap
  • @PareshGami 您好 Paresh,感谢您的评论,但我不知道如何使用带有 UI Bootstrap 的单独模板文件动态加载模态模板。
  • 其实我也尝试过使用 UI Bootstrap 库做同样的事情,结果是一样的。我设法加载了模板,但它没有显示出来。

标签: javascript html angularjs twitter-bootstrap bootstrap-modal


【解决方案1】:

您可以使用多种技术解决此问题。有一些模块可以提供模态服务,包括 angular-ui,我认为这些模块可以更好(甚至更多)解决您的问题。

角度模态服务

angular-modal-service 是一个专门用于创建模态的模块。它允许提供模板或模板服务,并支持为您的模态定义范围(用于抽象)。

您上面的示例代码将是

<div class="modal fade" id="modal" role="dialog">
    <div class="modal-dialog" modal-sm>
        <div class="modal-content">
            <div class="modal-header">
                <h4>Pop-up head. Email</h4>
            </div>
            <div class="modal-body">
                <h4>Pop-up body.</h4>
            </div>
            <div class="modal-footer">
                <button class="btn btn-primary">Save</button>
            </div>
        </div>
    </div>
</div>
// Do not forget to include the module dependency: var myApp = angular.module('myApp', ['angularModalService']);
myApp.controller('MyController', ['ModalService', function (ModalService) {
    $scope.load_modal_sms = function () {
        var modal = ModalService.showModal({
          templateUrl: "/static/partials/modal_template.html",
          controller: function () { /* controller code */ }
        }).then(function (modal) {
            // Modal has been loaded...
            modal.element.modal();
        });
    };
}]);

angular-ui-bootstrap

angular-ui-bootstrap (bower install angular-ui-bootstrap) 有一个非常易于使用的$modal 服务:

<div class="modal fade" id="modal" role="dialog">
    <div class="modal-dialog" modal-sm>
        <div class="modal-content">
            <div class="modal-header">
                <h4>Pop-up head. Email</h4>
            </div>
            <div class="modal-body">
                <h4>Pop-up body.</h4>
            </div>
            <div class="modal-footer">
                <button class="btn btn-primary">Save</button>
            </div>
        </div>
    </div>
</div>
// Do not forget to include the module dependency: var myApp = angular.module('myApp', ['ui.bootstrap.modal']);
myApp.controller('MyController', ['$modal', function ($modal) {
    $scope.load_modal_sms = function () {
        var modal = $modal.open({
          templateUrl: "/static/partials/modal_template.html",
          scope: { /* custom scope */ }
        });
    };
}]);

使用你的方法

在尝试 .modal() 之前,您可能希望先给 Angular 一些时间来加载和渲染加载的模板。如果您没有注意到,您的callback 并没有做任何特别的事情。您也可以在没有任何回调的情况下运行代码。

<div class="modal fade" id="modal" role="dialog" ng-if="detectLoaded()">
    <div class="modal-dialog" modal-sm>
        <div class="modal-content">
            <div class="modal-header">
                <h4>Pop-up head. Email</h4>
            </div>
            <div class="modal-body">
                <h4>Pop-up body.</h4>
            </div>
            <div class="modal-footer">
                <button class="btn btn-primary">Save</button>
            </div>
        </div>
    </div>
</div>
function set_modal_template(templateName) {
    $scope.modal_template = templateName;
}

$scope.load_modal_sms = function () {
    set_modal_template("/static/partials/modal_template.html");
};

$scope.detectLoaded = function () {
    // If this function is called, the template has been loaded...
    setTimeout(function () { // Give some time for the template to be fully rendered
        $('#modal').modal('show');
    }, 10);
    return true;
};

您还可以通过更改 ng-if 的位置或在 div 之后创建存根元素来消除超时。您可以从 detectLoaded 函数返回 false 以使存根元素不显示。我没有测试过最后一个选项,不知道它是否有效,你必须检查一下。

<div class="modal fade" id="modal" role="dialog">
    <div class="modal-dialog" modal-sm>
        <div class="modal-content">
            <div class="modal-header">
                <h4>Pop-up head. Email</h4>
            </div>
            <div class="modal-body">
                <h4>Pop-up body.</h4>
            </div>
            <div class="modal-footer">
                <button class="btn btn-primary">Save</button>
            </div>
        </div>
    </div>
</div>
<div ng-if="detectLoaded()"></div>
$scope.detectLoaded = function () {
    $('#modal').modal('show');
    return false;
};

【讨论】:

  • 谢谢,我知道给它一个超时会起作用(并且正在起作用),但我想知道是否可以在没有超时的情况下做到这一点。
  • 有可能。只需将ng-if="detectLoaded()" 添加到 HTML 中的最后一个元素(以确保第一个元素在调用 modal 之前已经可用)。或者,更好的是,在最后创建一个存根元素以用作检测器。
  • 我已编辑答案以添加第二个选项而不会超时。不是 100% 确定它会起作用,但值得一试。
  • 哦,你可以简单地使用 $modal 服务。它可以让你免于这样的事情。
  • 我通过模态服务解决了。我认为这比您描述的要好得多,并且它支持动态内容。因此,如果您想编辑您的答案并将模态服务置于您提供的两个备选方案之上,我很乐意接受。
【解决方案2】:

我们在 Angular 11 点击事件Go中使用带有动态内容的打开引导模式弹出窗口@

<div class="container text-center my-5">
   <h2>Open Bootstrap Modal Popup With Dynamic Content Angular 11</h2>
   <!-- Button to Open the Modal -->
   <button type="button" class="btn btn-primary text-center" (click) = "show()">
     Open modal
   </button>
 <style>
    .c{
      margin-top: 169px;
    }
 </style>
   <!-- The Modal -->
   <div class="modal c" id="myModal" [style.display]="showModal ? 'block' : 'none'">
     <div class="modal-dialog">
       <div class="modal-content">
       
         <!-- Modal Header -->
         <div class="modal-header">
           <h4 class="modal-title">{{ title }}</h4>
           <button type="button" class="close" data-dismiss="modal" (click) = "hide()">&times;</button>
         </div>
         
         <!-- Modal body -->
         <div class="modal-body">
           {{ content }}
         </div>
         
         <!-- Modal footer -->
         <div class="modal-footer">
           <button type="button" class="btn btn-danger" data-dismiss="modal" (click) = "hide()">Close</button>
         </div>
         
       </div>
     </div>
   </div>
 </div>

Ts 文件

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  showModal: boolean = false;
  content: any;
  title: any;


  //Bootstrap Modal Open event
  show() {
    this.showModal = true; // Show-Hide Modal Check
    this.content = "Welcome to phpcodingstuff.com we learn Open Bootstrap Modal Popup With Dynamic Content  "; // Dynamic Data
    this.title = "This tutorial phpcodingstuff.com";    // Dynamic Data
  }
  //Bootstrap Modal Close event
  hide() {
    this.showModal = false;

  }

}

原文出处https://www.phpcodingstuff.com/blog/open-bootstrap-modal-popup-with-dynamic-content-angular-11.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多