@@ -257,7 +257,7 @@ function InterimElementProvider() {
257
257
* A service used to control inserting and removing an element into the DOM.
258
258
*
259
259
*/
260
- var service , stack = [ ] ;
260
+ var service , stack = [ ] , hideQueue = 0 ;
261
261
262
262
// Publish instance $$interimElement service;
263
263
// ... used as $mdDialog, $mdToast, $mdMenu, and $mdSelect
@@ -291,6 +291,12 @@ function InterimElementProvider() {
291
291
// This hide()s only the current interim element before showing the next, new one
292
292
// NOTE: this is not reversible (e.g. interim elements are not stackable)
293
293
294
+ if ( ! hideExisting ) {
295
+ return $q ( function ( resolve , reject ) {
296
+ reject ( "Too many interim elements in queue!" ) ;
297
+ } )
298
+ }
299
+
294
300
hideExisting . finally ( function ( ) {
295
301
296
302
stack . push ( interimElement ) ;
@@ -323,30 +329,40 @@ function InterimElementProvider() {
323
329
*/
324
330
function hide ( reason , options ) {
325
331
if ( ! stack . length ) return $q . when ( reason ) ;
332
+ if ( hideQueue >= stack . length ) return ;
326
333
options = options || { } ;
327
334
328
335
if ( options . closeAll ) {
329
- var promise = $q . all ( stack . reverse ( ) . map ( closeElement ) ) ;
330
- stack = [ ] ;
331
- return promise ;
336
+ return $q . all ( stack . reverse ( ) . map ( closeElement ) ) ;
332
337
} else if ( options . closeTo !== undefined ) {
333
- return $q . all ( stack . splice ( options . closeTo ) . map ( closeElement ) ) ;
338
+ return $q . all ( stack . slice ( options . closeTo ) . map ( closeElement ) ) ;
334
339
} else {
335
- var interim = stack . pop ( ) ;
336
- return closeElement ( interim ) ;
340
+ return closeElement ( stack [ hideQueue ] ) ;
337
341
}
338
342
339
343
function closeElement ( interim ) {
344
+ hideQueue ++ ;
340
345
interim
341
346
. remove ( reason , false , options || { } )
342
347
. catch ( function ( reason ) {
343
348
//$log.error("InterimElement.hide() error: " + reason );
344
349
return reason ;
350
+ } )
351
+ . finally ( function ( ) {
352
+ handleElementHide ( interim ) ;
345
353
} ) ;
346
354
return interim . deferred . promise ;
347
355
}
348
356
}
349
357
358
+ function handleElementHide ( element ) {
359
+ var index = stack . indexOf ( element ) ;
360
+ if ( index != - 1 ) {
361
+ stack . splice ( index , 1 ) ;
362
+ }
363
+ hideQueue -- ;
364
+ }
365
+
350
366
/*
351
367
* @ngdoc method
352
368
* @name $$interimElement.$service#cancel
@@ -363,11 +379,15 @@ function InterimElementProvider() {
363
379
var interim = stack . shift ( ) ;
364
380
if ( ! interim ) return $q . when ( reason ) ;
365
381
382
+ hideQueue ++ ;
366
383
interim
367
384
. remove ( reason , true , options || { } )
368
385
. catch ( function ( reason ) {
369
386
//$log.error("InterimElement.cancel() error: " + reason );
370
387
return reason ;
388
+ } )
389
+ . finally ( function ( ) {
390
+ hideQueue -- ;
371
391
} ) ;
372
392
373
393
return interim . deferred . promise ;
@@ -378,7 +398,7 @@ function InterimElementProvider() {
378
398
* Note: interim elements are in "interim containers"
379
399
*/
380
400
function destroy ( target ) {
381
- var interim = ! target ? stack . shift ( ) : null ;
401
+ var interim = ! target ? stack . splice ( hideQueue , 1 ) [ 0 ] : null ;
382
402
var cntr = angular . element ( target ) . length ? angular . element ( target ) [ 0 ] . parentNode : null ;
383
403
384
404
if ( cntr ) {
0 commit comments