@@ -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,10 @@ 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 . reject ( 'Too many interim elements in queue!' ) ;
296
+ }
297
+
294
298
hideExisting . finally ( function ( ) {
295
299
296
300
stack . push ( interimElement ) ;
@@ -323,30 +327,40 @@ function InterimElementProvider() {
323
327
*/
324
328
function hide ( reason , options ) {
325
329
if ( ! stack . length ) return $q . when ( reason ) ;
330
+ if ( hideQueue >= stack . length ) return ;
326
331
options = options || { } ;
327
332
328
333
if ( options . closeAll ) {
329
- var promise = $q . all ( stack . reverse ( ) . map ( closeElement ) ) ;
330
- stack = [ ] ;
331
- return promise ;
332
- } else if ( options . closeTo !== undefined ) {
333
- return $q . all ( stack . splice ( options . closeTo ) . map ( closeElement ) ) ;
334
+ return $q . all ( stack . reverse ( ) . map ( closeElement ) ) ;
335
+ } else if ( options . closeTo ) {
336
+ return $q . all ( stack . slice ( options . closeTo ) . map ( closeElement ) ) ;
334
337
} else {
335
- var interim = stack . pop ( ) ;
336
- return closeElement ( interim ) ;
338
+ return closeElement ( stack [ hideQueue ] ) ;
337
339
}
338
340
339
341
function closeElement ( interim ) {
342
+ hideQueue ++ ;
340
343
interim
341
344
. remove ( reason , false , options || { } )
342
345
. catch ( function ( reason ) {
343
346
//$log.error("InterimElement.hide() error: " + reason );
344
347
return reason ;
348
+ } )
349
+ . finally ( function ( ) {
350
+ handleElementHide ( interim ) ;
345
351
} ) ;
346
352
return interim . deferred . promise ;
347
353
}
348
354
}
349
355
356
+ function handleElementHide ( element ) {
357
+ var index = stack . indexOf ( element ) ;
358
+ if ( index != - 1 ) {
359
+ stack . splice ( index , 1 ) ;
360
+ }
361
+ hideQueue -- ;
362
+ }
363
+
350
364
/*
351
365
* @ngdoc method
352
366
* @name $$interimElement.$service#cancel
@@ -363,11 +377,15 @@ function InterimElementProvider() {
363
377
var interim = stack . shift ( ) ;
364
378
if ( ! interim ) return $q . when ( reason ) ;
365
379
380
+ hideQueue ++ ;
366
381
interim
367
382
. remove ( reason , true , options || { } )
368
383
. catch ( function ( reason ) {
369
384
//$log.error("InterimElement.cancel() error: " + reason );
370
385
return reason ;
386
+ } )
387
+ . finally ( function ( ) {
388
+ hideQueue -- ;
371
389
} ) ;
372
390
373
391
return interim . deferred . promise ;
@@ -378,7 +396,7 @@ function InterimElementProvider() {
378
396
* Note: interim elements are in "interim containers"
379
397
*/
380
398
function destroy ( target ) {
381
- var interim = ! target ? stack . shift ( ) : null ;
399
+ var interim = ! target ? stack . splice ( hideQueue , 1 ) [ 0 ] : null ;
382
400
var cntr = angular . element ( target ) . length ? angular . element ( target ) [ 0 ] . parentNode : null ;
383
401
384
402
if ( cntr ) {
0 commit comments