@@ -23,6 +23,13 @@ angular.module('ui.bootstrap.modal', [])
23
23
}
24
24
}
25
25
} ,
26
+ keys : function ( ) {
27
+ var keys = [ ] ;
28
+ for ( var i = 0 ; i < stack . length ; i ++ ) {
29
+ keys . push ( stack [ i ] . key ) ;
30
+ }
31
+ return keys ;
32
+ } ,
26
33
top : function ( ) {
27
34
return stack [ stack . length - 1 ] ;
28
35
} ,
@@ -53,7 +60,6 @@ angular.module('ui.bootstrap.modal', [])
53
60
. directive ( 'modalBackdrop' , [ '$modalStack' , '$timeout' , function ( $modalStack , $timeout ) {
54
61
return {
55
62
restrict : 'EA' ,
56
- scope : { } ,
57
63
replace : true ,
58
64
templateUrl : 'template/modal/backdrop.html' ,
59
65
link : function ( scope , element , attrs ) {
@@ -65,11 +71,10 @@ angular.module('ui.bootstrap.modal', [])
65
71
66
72
scope . close = function ( evt ) {
67
73
var modal = $modalStack . getTop ( ) ;
68
- //TODO: this logic is duplicated with the place where modal gets opened
69
- if ( modal && modal . window . backdrop && modal . window . backdrop != 'static' ) {
74
+ if ( modal && modal . value . backdrop && modal . value . backdrop != 'static' ) {
70
75
evt . preventDefault ( ) ;
71
76
evt . stopPropagation ( ) ;
72
- $modalStack . dismiss ( modal . instance , 'backdrop click' ) ;
77
+ $modalStack . dismiss ( modal . key , 'backdrop click' ) ;
73
78
}
74
79
} ;
75
80
}
@@ -79,7 +84,9 @@ angular.module('ui.bootstrap.modal', [])
79
84
. directive ( 'modalWindow' , [ '$timeout' , function ( $timeout ) {
80
85
return {
81
86
restrict : 'EA' ,
82
- scope : { } ,
87
+ scope : {
88
+ index : '@'
89
+ } ,
83
90
replace : true ,
84
91
transclude : true ,
85
92
templateUrl : 'template/modal/window.html' ,
@@ -97,23 +104,41 @@ angular.module('ui.bootstrap.modal', [])
97
104
. factory ( '$modalStack' , [ '$document' , '$compile' , '$rootScope' , '$$stackedMap' ,
98
105
function ( $document , $compile , $rootScope , $$stackedMap ) {
99
106
107
+ var backdropjqLiteEl , backdropDomEl ;
108
+ var backdropScope = $rootScope . $new ( true ) ;
100
109
var body = $document . find ( 'body' ) . eq ( 0 ) ;
101
110
var openedWindows = $$stackedMap . createNew ( ) ;
102
111
var $modalStack = { } ;
103
112
113
+ function backdropIndex ( ) {
114
+ var topBackdropIndex = - 1 ;
115
+ var opened = openedWindows . keys ( ) ;
116
+ for ( var i = 0 ; i < opened . length ; i ++ ) {
117
+ if ( openedWindows . get ( opened [ i ] ) . value . backdrop ) {
118
+ topBackdropIndex = i ;
119
+ }
120
+ }
121
+ return topBackdropIndex ;
122
+ }
123
+
124
+ $rootScope . $watch ( backdropIndex , function ( newBackdropIndex ) {
125
+ backdropScope . index = newBackdropIndex ;
126
+ } ) ;
127
+
104
128
function removeModalWindow ( modalInstance ) {
105
129
106
130
var modalWindow = openedWindows . get ( modalInstance ) . value ;
107
131
108
132
//clean up the stack
109
133
openedWindows . remove ( modalInstance ) ;
110
134
111
- //remove DOM element
135
+ //remove window DOM element
112
136
modalWindow . modalDomEl . remove ( ) ;
113
137
114
- //remove backdrop
115
- if ( modalWindow . backdropDomEl ) {
116
- modalWindow . backdropDomEl . remove ( ) ;
138
+ //remove backdrop if no longer needed
139
+ if ( backdropIndex ( ) == - 1 ) {
140
+ backdropDomEl . remove ( ) ;
141
+ backdropDomEl = undefined ;
117
142
}
118
143
119
144
//destroy scope
@@ -135,27 +160,27 @@ angular.module('ui.bootstrap.modal', [])
135
160
136
161
$modalStack . open = function ( modalInstance , modal ) {
137
162
138
- var backdropDomEl ;
139
- if ( modal . backdrop ) {
140
- backdropDomEl = $compile ( angular . element ( '<div modal-backdrop></div>' ) ) ( $rootScope ) ;
141
- body . append ( backdropDomEl ) ;
142
- }
163
+ openedWindows . add ( modalInstance , {
164
+ deferred : modal . deferred ,
165
+ modalScope : modal . scope ,
166
+ backdrop : modal . backdrop ,
167
+ keyboard : modal . keyboard
168
+ } ) ;
143
169
144
170
var angularDomEl = angular . element ( '<div modal-window></div>' ) ;
145
171
angularDomEl . attr ( 'window-class' , modal . windowClass ) ;
172
+ angularDomEl . attr ( 'index' , openedWindows . length ( ) - 1 ) ;
146
173
angularDomEl . html ( modal . content ) ;
147
174
148
175
var modalDomEl = $compile ( angularDomEl ) ( modal . scope ) ;
176
+ openedWindows . top ( ) . value . modalDomEl = modalDomEl ;
149
177
body . append ( modalDomEl ) ;
150
178
151
- openedWindows . add ( modalInstance , {
152
- deferred : modal . deferred ,
153
- modalScope : modal . scope ,
154
- modalDomEl : modalDomEl ,
155
- backdrop : modal . backdrop ,
156
- backdropDomEl : backdropDomEl ,
157
- keyboard : modal . keyboard
158
- } ) ;
179
+ if ( backdropIndex ( ) >= 0 && ! backdropDomEl ) {
180
+ backdropjqLiteEl = angular . element ( '<div modal-backdrop></div>' ) ;
181
+ backdropDomEl = $compile ( backdropjqLiteEl ) ( backdropScope ) ;
182
+ body . append ( backdropDomEl ) ;
183
+ }
159
184
} ;
160
185
161
186
$modalStack . close = function ( modalInstance , result ) {
@@ -175,13 +200,7 @@ angular.module('ui.bootstrap.modal', [])
175
200
} ;
176
201
177
202
$modalStack . getTop = function ( ) {
178
- var top = openedWindows . top ( ) ;
179
- if ( top ) {
180
- return {
181
- instance : top . key ,
182
- window : top . value
183
- } ;
184
- }
203
+ return openedWindows . top ( ) ;
185
204
} ;
186
205
187
206
return $modalStack ;
0 commit comments