forked from btford/angular-modal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodal.js
91 lines (81 loc) · 2.22 KB
/
modal.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
* @license
* angular-modal v0.4.0
* (c) 2013 Brian Ford http://briantford.com
* License: MIT
*/
'use strict';
angular.module('btford.modal', []).
factory('btfModal', function ($animate, $compile, $rootScope, $controller, $q, $http, $templateCache) {
return function modalFactory (config) {
if (!(!config.template ^ !config.templateUrl)) {
throw new Error('Expected modal to have exacly one of either `template` or `templateUrl`');
}
var template = config.template,
controller = config.controller || angular.noop,
controllerAs = config.controllerAs,
container = angular.element(config.container || document.body),
element = null,
html,
scope;
if (config.template) {
var deferred = $q.defer();
deferred.resolve(config.template);
html = deferred.promise;
} else {
html = $http.get(config.templateUrl, {
cache: $templateCache
}).
then(function (response) {
return response.data;
});
}
function activate (locals) {
return html.then(function (html) {
if (!element) {
attach(html, locals);
}
return element;
});
}
function attach (html, locals) {
element = angular.element(html);
if (element.length === 0) {
throw new Error('The template contains no elements; you need to wrap text nodes')
}
$animate.enter(element, container);
scope = $rootScope.$new();
if (locals) {
for (var prop in locals) {
scope[prop] = locals[prop];
}
}
var ctrl = $controller(controller, { $scope: scope });
if (controllerAs) {
scope[controllerAs] = ctrl;
}
$compile(element)(scope);
}
function deactivate () {
var deferred = $q.defer();
if (element) {
$animate.leave(element, function () {
scope.$destroy();
element = null;
deferred.resolve();
});
} else {
deferred.resolve();
}
return deferred.promise;
}
function active () {
return !!element;
}
return {
activate: activate,
deactivate: deactivate,
active: active
};
};
});