Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit e9c4977

Browse files
wesleychoFoxandxss
authored andcommitted
feat(modal): add closed promise
- Add `closed` promise for when the modal animation completes on removal Closes #4979
1 parent 9d139a5 commit e9c4977

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

src/modal/docs/readme.md

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ The `open` method returns a modal instance, an object with the following propert
2929
* `dismiss(reason)` - a method that can be used to dismiss a modal, passing a reason
3030
* `result` - a promise that is resolved when a modal is closed and rejected when a modal is dismissed
3131
* `opened` - a promise that is resolved when a modal gets opened after downloading content's template and resolving all variables
32+
* `closed` - a promise that is resolved when a modal is closed and the animation completes
3233
* `rendered` - a promise that is resolved when a modal is rendered.
3334

3435
In addition the scope associated with modal's content is augmented with 2 methods:

src/modal/modal.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap'])
306306
}
307307
}
308308

309-
function removeAfterAnimate(domEl, scope, done) {
309+
function removeAfterAnimate(domEl, scope, done, closedDeferred) {
310310
var asyncDeferred;
311311
var asyncPromise = null;
312312
var setIsAsync = function() {
@@ -336,6 +336,9 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap'])
336336
event: 'leave'
337337
}).start().then(function() {
338338
domEl.remove();
339+
if (closedDeferred) {
340+
closedDeferred.resolve();
341+
}
339342
});
340343

341344
scope.$destroy();
@@ -392,6 +395,7 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap'])
392395
openedWindows.add(modalInstance, {
393396
deferred: modal.deferred,
394397
renderDeferred: modal.renderDeferred,
398+
closedDeferred: modal.closedDeferred,
395399
modalScope: modal.scope,
396400
backdrop: modal.backdrop,
397401
keyboard: modal.keyboard,
@@ -579,12 +583,14 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap'])
579583
$modal.open = function(modalOptions) {
580584
var modalResultDeferred = $q.defer();
581585
var modalOpenedDeferred = $q.defer();
586+
var modalClosedDeferred = $q.defer();
582587
var modalRenderDeferred = $q.defer();
583588

584589
//prepare an instance of a modal to be injected into controllers and returned to a caller
585590
var modalInstance = {
586591
result: modalResultDeferred.promise,
587592
opened: modalOpenedDeferred.promise,
593+
closed: modalClosedDeferred.promise,
588594
rendered: modalRenderDeferred.promise,
589595
close: function (result) {
590596
return $modalStack.close(modalInstance, result);
@@ -655,6 +661,7 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap'])
655661
scope: modalScope,
656662
deferred: modalResultDeferred,
657663
renderDeferred: modalRenderDeferred,
664+
closedDeferred: modalClosedDeferred,
658665
content: tplAndVars[0],
659666
animation: modalOptions.animation,
660667
backdrop: modalOptions.backdrop,

src/modal/test/modal.spec.js

+14
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,20 @@ describe('$uibModal', function () {
388388
expect($document).toHaveModalsOpen(0);
389389
});
390390

391+
it('should resolve the closed promise when modal is closed', function() {
392+
var modal = open({template: '<div>Content</div>'});
393+
close(modal, 'closed ok');
394+
395+
expect(modal.closed).toBeResolvedWith(undefined);
396+
});
397+
398+
it('should resolve the closed promise when modal is dismissed', function() {
399+
var modal = open({template: '<div>Content</div>'});
400+
dismiss(modal, 'esc');
401+
402+
expect(modal.closed).toBeResolvedWith(undefined);
403+
});
404+
391405
it('should expose a promise linked to the templateUrl / resolve promises', function() {
392406
var modal = open({template: '<div>Content</div>', resolve: {
393407
ok: function() {return $q.when('ok');}

0 commit comments

Comments
 (0)