Skip to content

Commit 13658e0

Browse files
committed
Merge pull request facultymatt#52 from danielcrisp/develop
Prevent $digest already in progress error
2 parents bacefb9 + 6438113 commit 13658e0

File tree

3 files changed

+33
-21
lines changed

3 files changed

+33
-21
lines changed

dist/unsavedChanges.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,16 @@ angular.module('unsavedChanges', ['resettable'])
203203
// @todo this could be written a lot cleaner!
204204
if (!allFormsClean()) {
205205
unsavedWarningsConfig.log("a form is dirty");
206-
if (!confirm(unsavedWarningsConfig.navigateMessage)) {
207-
unsavedWarningsConfig.log("user wants to cancel leaving");
208-
event.preventDefault(); // user clicks cancel, wants to stay on page
209-
} else {
210-
unsavedWarningsConfig.log("user doesn't care about loosing stuff");
211-
$rootScope.$broadcast('resetResettables');
212-
}
206+
// allow any existing scope digest to complete
207+
setTimeout(function () {
208+
if (!confirm(unsavedWarningsConfig.navigateMessage)) {
209+
unsavedWarningsConfig.log("user wants to cancel leaving");
210+
event.preventDefault(); // user clicks cancel, wants to stay on page
211+
} else {
212+
unsavedWarningsConfig.log("user doesn't care about loosing stuff");
213+
$rootScope.$broadcast('resetResettables');
214+
}
215+
});
213216
} else {
214217
unsavedWarningsConfig.log("all forms are clean");
215218
}
@@ -237,8 +240,8 @@ angular.module('unsavedChanges', ['resettable'])
237240
}
238241
])
239242

240-
.directive('unsavedWarningForm', ['unsavedWarningSharedService', '$rootScope',
241-
function(unsavedWarningSharedService, $rootScope) {
243+
.directive('unsavedWarningForm', ['unsavedWarningSharedService', '$rootScope', '$timeout',
244+
function(unsavedWarningSharedService, $rootScope, $timeout) {
242245
return {
243246
scope: {},
244247
require: '^form',
@@ -278,7 +281,10 @@ angular.module('unsavedChanges', ['resettable'])
278281
// trigger resettables within this form or element
279282
var resettables = angular.element(formElement[0].querySelector('[resettable]'));
280283
if(resettables.length) {
281-
scope.$apply(resettables.triggerHandler('resetResettables'));
284+
// use safer method than $apply
285+
$timeout(function () {
286+
resettables.triggerHandler('resetResettables');
287+
});
282288
}
283289

284290
// sets for back to valid and pristine states

dist/unsavedChanges.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/unsavedChanges.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -200,13 +200,16 @@ angular.module('unsavedChanges', ['resettable'])
200200
// @todo this could be written a lot cleaner!
201201
if (!allFormsClean()) {
202202
unsavedWarningsConfig.log("a form is dirty");
203-
if (!confirm(unsavedWarningsConfig.navigateMessage)) {
204-
unsavedWarningsConfig.log("user wants to cancel leaving");
205-
event.preventDefault(); // user clicks cancel, wants to stay on page
206-
} else {
207-
unsavedWarningsConfig.log("user doesn't care about loosing stuff");
208-
$rootScope.$broadcast('resetResettables');
209-
}
203+
// allow any existing scope digest to complete
204+
setTimeout(function () {
205+
if (!confirm(unsavedWarningsConfig.navigateMessage)) {
206+
unsavedWarningsConfig.log("user wants to cancel leaving");
207+
event.preventDefault(); // user clicks cancel, wants to stay on page
208+
} else {
209+
unsavedWarningsConfig.log("user doesn't care about loosing stuff");
210+
$rootScope.$broadcast('resetResettables');
211+
}
212+
});
210213
} else {
211214
unsavedWarningsConfig.log("all forms are clean");
212215
}
@@ -234,8 +237,8 @@ angular.module('unsavedChanges', ['resettable'])
234237
}
235238
])
236239

237-
.directive('unsavedWarningForm', ['unsavedWarningSharedService', '$rootScope',
238-
function(unsavedWarningSharedService, $rootScope) {
240+
.directive('unsavedWarningForm', ['unsavedWarningSharedService', '$rootScope', '$timeout',
241+
function(unsavedWarningSharedService, $rootScope, $timeout) {
239242
return {
240243
scope: {},
241244
require: '^form',
@@ -275,7 +278,10 @@ angular.module('unsavedChanges', ['resettable'])
275278
// trigger resettables within this form or element
276279
var resettables = angular.element(formElement[0].querySelector('[resettable]'));
277280
if(resettables.length) {
278-
scope.$apply(resettables.triggerHandler('resetResettables'));
281+
// use safer method than $apply
282+
$timeout(function () {
283+
resettables.triggerHandler('resetResettables');
284+
});
279285
}
280286

281287
// sets for back to valid and pristine states

0 commit comments

Comments
 (0)