Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (function(angular) {
- // Define module.
- var module = angular.module('bootstrapModal', []);
- // Define service.
- module.service('$bootstrapModal', ['$q', '$templateRequest', '$rootScope', '$compile', '$controller', function($q, $templateRequest, $rootScope, $compile, $controller) {
- var self = this, $element, closedDeferred;
- // Gets template or template URL.
- var getTemplate = function(template, templateUrl) {
- var deferred = $q.defer();
- // Template string.
- if (template) {
- deferred.resolve(template);
- }
- // Template URL.
- else if (templateUrl) {
- $templateRequest(templateUrl, true).then(function(template) {
- deferred.resolve(template);
- }, function(error) {
- deferred.reject(error);
- });
- }
- // No template specified.
- else {
- deferred.reject('No modal template or templateUrl was specified.');
- }
- return deferred.promise;
- };
- // Closes modal.
- self.close = function() {
- closedDeferred = closedDeferred || $q.defer();
- if ($element) {
- $element.modal('hide');
- }
- else {
- closedDeferred.resolve();
- }
- return closedDeferred.promise;
- };
- // Opens modal.
- self.open = function(options) {
- var deferred = $q.defer();
- // Close open modal.
- this.close().catch(function(error) {
- deferred.reject(error);
- })
- // Get template.
- .then(function() {
- return getTemplate(options.template, options.templateUrl).catch(function(error) {
- deferred.reject(error);
- });
- })
- // Open modal.
- .then(function(template) {
- // Create scope with special $close() method.
- var scope = (options.scope || $rootScope).$new();
- angular.extend(scope, {$close: self.close}, options.data);
- // Bind template to scope.
- var element = $compile(template)(scope);
- // Create controller.
- element.controller = $controller(options.controller, {
- $scope: scope
- });
- // Create closed deferred.
- closedDeferred = $q.defer();
- // Append modal element to body.
- $element = $(element).appendTo('body')
- // Modal is shown.
- .on('shown.bs.modal', function() {
- // Autofocus support.
- angular.forEach($element.find('input,button,select,textarea'), function(input) {
- if (input.attributes.getNamedItem('autofocus')) {
- input.focus();
- }
- });
- // Resolve deferred and include closed deferred.
- deferred.resolve(angular.extend({}, self, {
- closed: closedDeferred.promise
- }));
- })
- // Modal is closed.
- .on('hidden.bs.modal', function() {
- $element.remove();
- $element = null;
- closedDeferred.resolve();
- })
- // Show modal.
- .modal();
- });
- return deferred.promise;
- };
- }]);
- }(angular));
Add Comment
Please, Sign In to add comment