aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/services.js4
-rw-r--r--test/servicesSpec.js50
-rw-r--r--test/widgetsSpec.js6
3 files changed, 56 insertions, 4 deletions
diff --git a/src/services.js b/src/services.js
index f7661310..d49b5370 100644
--- a/src/services.js
+++ b/src/services.js
@@ -819,12 +819,16 @@ angularServiceInject('$xhr.bulk', function($xhr, $error, $log){
* @param {function()} fn A function, who's execution should be deferred.
*/
angularServiceInject('$defer', function($browser, $exceptionHandler) {
+ var scope = this;
+
return function(fn) {
$browser.defer(function() {
try {
fn();
} catch(e) {
$exceptionHandler(e);
+ } finally {
+ scope.$eval();
}
});
};
diff --git a/test/servicesSpec.js b/test/servicesSpec.js
index 5a9a4702..bda7b47c 100644
--- a/test/servicesSpec.js
+++ b/test/servicesSpec.js
@@ -361,12 +361,41 @@ describe("service", function(){
it('should delegate exception to the $exceptionHandler service', function() {
- $defer(function() { throw "Test Error"; });
+ $defer(function() {throw "Test Error";});
expect($exceptionHandler).not.toHaveBeenCalled();
$browser.defer.flush();
expect($exceptionHandler).toHaveBeenCalledWith("Test Error");
});
+
+
+ it('should call eval after each callback is executed', function() {
+ var eval = this.spyOn(scope, '$eval').andCallThrough();
+
+ $defer(function() {});
+ expect(eval).wasNotCalled();
+
+ $browser.defer.flush();
+ expect(eval).wasCalled();
+
+ eval.reset(); //reset the spy;
+
+ $defer(function() {});
+ $defer(function() {});
+ $browser.defer.flush();
+ expect(eval.callCount).toBe(2);
+ });
+
+
+ it('should call eval even if an exception is thrown in callback', function() {
+ var eval = this.spyOn(scope, '$eval').andCallThrough();
+
+ $defer(function() {throw "Test Error"});
+ expect(eval).wasNotCalled();
+
+ $browser.defer.flush();
+ expect(eval).wasCalled();
+ });
});
@@ -543,6 +572,25 @@ describe("service", function(){
$browser.defer.flush();
expect(log).toEqual('"+";"+";'); //callback has executed
});
+
+ it('should call eval after callbacks for both cache hit and cache miss execute', function() {
+ var eval = this.spyOn(scope, '$eval').andCallThrough();
+
+ $browserXhr.expectGET('/url').respond('+');
+ cache('GET', '/url', null, callback);
+ expect(eval).wasNotCalled();
+
+ $browserXhr.flush();
+ expect(eval).wasCalled();
+
+ eval.reset(); //reset the spy
+
+ cache('GET', '/url', null, callback);
+ expect(eval).wasNotCalled();
+
+ $browser.defer.flush();
+ expect(eval).wasCalled();
+ })
});
});
diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js
index 7253c26f..bff2c4e3 100644
--- a/test/widgetsSpec.js
+++ b/test/widgetsSpec.js
@@ -571,8 +571,8 @@ describe("widget", function(){
// this one should really be just '1', but due to lack of real events things are not working
// properly. see discussion at: http://is.gd/ighKk
- expect(element.text()).toEqual('2');
- dealoc(scope);
+ expect(element.text()).toEqual('4');
+ dealoc(element);
});
it('should evaluate onload expression when a partial is loaded', function() {
@@ -587,7 +587,7 @@ describe("widget", function(){
scope.$inject('$browser').defer.flush();
expect(element.text()).toEqual('my partial');
expect(scope.loaded).toBe(true);
- dealoc(scope);
+ dealoc(element);
});
});