Invocando la ventana modal en la interfaz de USUARIO de Bootstrap de AngularJS usando JavaScript


Usando el ejemplo mencionado aquí, ¿cómo puedo invocar la ventana modal usando JavaScript en lugar de hacer clic en un botón?

Soy nuevo en AngularJS e intenté buscar la documentación aquí y aquí sin suerte.

Gracias

Author: Ahmad Alfy, 2013-04-28

6 answers

OK, así que primero de todo el http://angular-ui.github.io/bootstrap / tiene una directiva <modal> y el servicio $dialog y ambos se pueden usar para abrir ventanas modales.

La diferencia es que con la directiva <modal> el contenido de un modal está incrustado en una plantilla de alojamiento (una que activa la apertura de la ventana modal). El servicio $dialog es mucho más flexible y le permite cargar contenido modal desde un archivo separado, así como activar ventanas modales desde cualquier lugar en el código AngularJS (se trata de un controlador, un servicio u otra directiva).

No estoy seguro de lo que quieres decir exactamente con "usar código JavaScript", pero suponiendo que te refieras a cualquier lugar en el código AngularJS, el servicio $dialog es probablemente un camino a seguir.

Es muy fácil de usar y en su forma más simple solo podría escribir:

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

Para ilustrar que puede ser realmente activado por cualquier código JavaScript aquí hay una versión que desencadena modal con un temporizador, 3 segundos después de que un controlador fue instanciado:

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

Esto se puede ver en acción en este plunk: http://plnkr.co/edit/u9HHaRlHnko492WDtmRU?p=preview

Finalmente, aquí está la documentación de referencia completa para el servicio $dialog descrito aquí: https://github.com/angular-ui/bootstrap/blob/master/src/dialog/README.md

 73
Author: pkozlowski.opensource,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-28 18:20:48

Para hacer que angular ui mod modal funcione con bootstrap 3 necesita sobrescribir los estilos

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

(Las últimas son necesarias si usa directivas personalizadas) y encapsula el html con

<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 -->
 29
Author: Hawk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-11 11:04:43

Abrir ventanas modales pasando datos a dialog

En caso de que alguien desee pasar datos al diálogo:

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');
      };
}

Demo Plunker

 27
Author: Maxim Shoustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-13 20:09:16

El sitio web de AngularJS Bootstrap no ha sido actualizado con la documentación más reciente. Hace aproximadamente 3 meses pkozlowski-opensource escribió un cambio para separar out mod modal de dialog dialog commit es el siguiente:

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

En esa confirmación agregó nueva documentación para mod modal, que se puede encontrar abajo:

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

Espero que esto ayude!

 17
Author: Craig Ruks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-27 19:39:36

Camino Rápido y Sucio!

No es una buena manera, pero para mí parece la más simple.

Agregue una etiqueta de anclaje que contenga los datos modales-target y data-toggle, tenga un id asociado. (Se puede añadir sobre todo en cualquier lugar en la vista html)

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

Ahora,

Dentro del controlador angular, desde donde desea activar el modal solo use

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

Esto imitará un clic en el botón basado en el código angular y aparecerá el modal.

 17
Author: Gagandeep Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-14 17:00:03

Versión diferente similar a la ofrecida por Maxim Shoustin

Me gustó la respuesta, pero la parte que me molestó fue el uso de <script id="..."> como un contenedor para la plantilla del modal.

Quería colocar la plantilla del modal en un <div> oculto y enlazar el html interno con una variable de ámbito llamada modal_html_template principalmente porque creo que es más correcto (y más cómodo de procesar en WebStorm/PyCharm) colocar el html de la plantilla dentro de un <div> en lugar de <script id="...">

Esto la variable se utilizará cuando se llame a $modal({... 'template': $scope.modal_html_template, ...})

Para enlazar el html interno, creé inner-html-bind que es una directiva simple

Echa un vistazo al ejemplo émbolo

<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 directiva:

app.directive('innerHtmlBind', function() {
  return {
    restrict: 'A',
    scope: {
      inner_html: '=innerHtml'
    },
    link: function(scope, element, attrs) {
      scope.inner_html = element.html();
    }
  }
});
 4
Author: Jossef Harush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-30 16:14:24