@@ -611,6 +611,11 @@ angular.module('ui.bootstrap.modal', [])
611
611
return promisesArr ;
612
612
}
613
613
614
+ var promiseChain = null ;
615
+ $modal . getPromiseChain = function ( ) {
616
+ return promiseChain ;
617
+ } ;
618
+
614
619
$modal . open = function ( modalOptions ) {
615
620
616
621
var modalResultDeferred = $q . defer ( ) ;
@@ -642,63 +647,70 @@ angular.module('ui.bootstrap.modal', [])
642
647
var templateAndResolvePromise =
643
648
$q . all ( [ getTemplatePromise ( modalOptions ) ] . concat ( getResolvePromises ( modalOptions . resolve ) ) ) ;
644
649
650
+ // Wait for the resolution of the existing promise chain.
651
+ // Then switch to our own combined promise dependency (regardless of how the previous modal fared).
652
+ // Then add to $modalStack and resolve opened.
653
+ // Finally clean up the chain variable if no subsequent modal has overwritten it.
654
+ var samePromise ;
655
+ samePromise = promiseChain = $q . all ( [ promiseChain ] )
656
+ . then ( function ( ) { return templateAndResolvePromise ; } , function ( ) { return templateAndResolvePromise ; } )
657
+ . then ( function resolveSuccess ( tplAndVars ) {
658
+
659
+ var modalScope = ( modalOptions . scope || $rootScope ) . $new ( ) ;
660
+ modalScope . $close = modalInstance . close ;
661
+ modalScope . $dismiss = modalInstance . dismiss ;
662
+
663
+ modalScope . $on ( '$destroy' , function ( ) {
664
+ if ( ! modalScope . $$uibDestructionScheduled ) {
665
+ modalScope . $dismiss ( '$uibUnscheduledDestruction' ) ;
666
+ }
667
+ } ) ;
645
668
646
- templateAndResolvePromise . then ( function resolveSuccess ( tplAndVars ) {
647
-
648
- var modalScope = ( modalOptions . scope || $rootScope ) . $new ( ) ;
649
- modalScope . $close = modalInstance . close ;
650
- modalScope . $dismiss = modalInstance . dismiss ;
651
-
652
- modalScope . $on ( '$destroy' , function ( ) {
653
- if ( ! modalScope . $$uibDestructionScheduled ) {
654
- modalScope . $dismiss ( '$uibUnscheduledDestruction' ) ;
655
- }
656
- } ) ;
669
+ var ctrlInstance , ctrlLocals = { } ;
670
+ var resolveIter = 1 ;
657
671
658
- var ctrlInstance , ctrlLocals = { } ;
659
- var resolveIter = 1 ;
672
+ //controllers
673
+ if ( modalOptions . controller ) {
674
+ ctrlLocals . $scope = modalScope ;
675
+ ctrlLocals . $modalInstance = modalInstance ;
676
+ angular . forEach ( modalOptions . resolve , function ( value , key ) {
677
+ ctrlLocals [ key ] = tplAndVars [ resolveIter ++ ] ;
678
+ } ) ;
660
679
661
- //controllers
662
- if ( modalOptions . controller ) {
663
- ctrlLocals . $scope = modalScope ;
664
- ctrlLocals . $modalInstance = modalInstance ;
665
- angular . forEach ( modalOptions . resolve , function ( value , key ) {
666
- ctrlLocals [ key ] = tplAndVars [ resolveIter ++ ] ;
667
- } ) ;
680
+ ctrlInstance = $controller ( modalOptions . controller , ctrlLocals ) ;
681
+ if ( modalOptions . controllerAs ) {
682
+ if ( modalOptions . bindToController ) {
683
+ angular . extend ( ctrlInstance , modalScope ) ;
684
+ }
668
685
669
- ctrlInstance = $controller ( modalOptions . controller , ctrlLocals ) ;
670
- if ( modalOptions . controllerAs ) {
671
- if ( modalOptions . bindToController ) {
672
- angular . extend ( ctrlInstance , modalScope ) ;
686
+ modalScope [ modalOptions . controllerAs ] = ctrlInstance ;
673
687
}
674
-
675
- modalScope [ modalOptions . controllerAs ] = ctrlInstance ;
676
688
}
677
- }
678
689
679
- $modalStack . open ( modalInstance , {
680
- scope : modalScope ,
681
- deferred : modalResultDeferred ,
682
- renderDeferred : modalRenderDeferred ,
683
- content : tplAndVars [ 0 ] ,
684
- animation : modalOptions . animation ,
685
- backdrop : modalOptions . backdrop ,
686
- keyboard : modalOptions . keyboard ,
687
- backdropClass : modalOptions . backdropClass ,
688
- windowClass : modalOptions . windowClass ,
689
- windowTemplateUrl : modalOptions . windowTemplateUrl ,
690
- size : modalOptions . size ,
691
- openedClass : modalOptions . openedClass
692
- } ) ;
690
+ $modalStack . open ( modalInstance , {
691
+ scope : modalScope ,
692
+ deferred : modalResultDeferred ,
693
+ renderDeferred : modalRenderDeferred ,
694
+ content : tplAndVars [ 0 ] ,
695
+ animation : modalOptions . animation ,
696
+ backdrop : modalOptions . backdrop ,
697
+ keyboard : modalOptions . keyboard ,
698
+ backdropClass : modalOptions . backdropClass ,
699
+ windowClass : modalOptions . windowClass ,
700
+ windowTemplateUrl : modalOptions . windowTemplateUrl ,
701
+ size : modalOptions . size ,
702
+ openedClass : modalOptions . openedClass
703
+ } ) ;
704
+ modalOpenedDeferred . resolve ( true ) ;
693
705
694
706
} , function resolveError ( reason ) {
695
- modalResultDeferred . reject ( reason ) ;
696
- } ) ;
697
-
698
- templateAndResolvePromise . then ( function ( ) {
699
- modalOpenedDeferred . resolve ( true ) ;
700
- } , function ( reason ) {
701
707
modalOpenedDeferred . reject ( reason ) ;
708
+ modalResultDeferred . reject ( reason ) ;
709
+ } )
710
+ . finally ( function ( ) {
711
+ if ( promiseChain === samePromise ) {
712
+ promiseChain = null ;
713
+ }
702
714
} ) ;
703
715
704
716
return modalInstance ;
0 commit comments