@@ -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,43 @@ function InterimElementProvider() {
323
327
*/
324
328
function hide ( reason , options ) {
325
329
if ( ! stack . length ) return $q . when ( reason ) ;
330
+ if ( stack . length - 1 - hideQueue < 0 ) 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
- } else {
335
- var interim = stack . pop ( ) ;
336
- return closeElement ( interim ) ;
334
+ return $q . all ( stack . reverse ( ) . map ( closeElement ) ) ;
335
+ }
336
+
337
+ if ( options . closeTo ) {
338
+ return $q . all ( stack . slice ( options . closeTo ) . map ( closeElement ) ) ;
337
339
}
338
340
341
+ // Poll the first added interim element, which isn't currently hiding.
342
+ return closeElement ( stack [ stack . length - 1 - hideQueue ] ) ;
343
+
339
344
function closeElement ( interim ) {
345
+ hideQueue ++ ;
340
346
interim
341
347
. remove ( reason , false , options || { } )
342
348
. catch ( function ( reason ) {
343
349
//$log.error("InterimElement.hide() error: " + reason );
344
350
return reason ;
351
+ } )
352
+ . finally ( function ( ) {
353
+ handleElementHide ( interim ) ;
345
354
} ) ;
346
355
return interim . deferred . promise ;
347
356
}
348
357
}
349
358
359
+ function handleElementHide ( element ) {
360
+ var index = stack . indexOf ( element ) ;
361
+ if ( index != - 1 ) {
362
+ stack . splice ( index , 1 ) ;
363
+ }
364
+ hideQueue -- ;
365
+ }
366
+
350
367
/*
351
368
* @ngdoc method
352
369
* @name $$interimElement.$service#cancel
@@ -360,14 +377,18 @@ function InterimElementProvider() {
360
377
*
361
378
*/
362
379
function cancel ( reason , options ) {
363
- var interim = stack . shift ( ) ;
380
+ var interim = stack . pop ( ) ;
364
381
if ( ! interim ) return $q . when ( reason ) ;
365
382
383
+ hideQueue ++ ;
366
384
interim
367
385
. remove ( reason , true , options || { } )
368
386
. catch ( function ( reason ) {
369
387
//$log.error("InterimElement.cancel() error: " + reason );
370
388
return reason ;
389
+ } )
390
+ . finally ( function ( ) {
391
+ hideQueue -- ;
371
392
} ) ;
372
393
373
394
return interim . deferred . promise ;
@@ -378,7 +399,7 @@ function InterimElementProvider() {
378
399
* Note: interim elements are in "interim containers"
379
400
*/
380
401
function destroy ( target ) {
381
- var interim = ! target ? stack . shift ( ) : null ;
402
+ var interim = ! target ? stack . splice ( hideQueue , 1 ) [ 0 ] : null ;
382
403
var cntr = angular . element ( target ) . length ? angular . element ( target ) [ 0 ] . parentNode : null ;
383
404
384
405
if ( cntr ) {
0 commit comments