diff --git a/src/resolve.js b/src/resolve.js index 6d8f381d2..ea30680cf 100644 --- a/src/resolve.js +++ b/src/resolve.js @@ -102,6 +102,7 @@ function $Resolve( $q, $injector) { if (!merged) merge(values, parent.$$values); result.$$values = values; result.$$promises = true; // keep for isResolve() + delete result.$$inheritedValues; resolution.resolve(values); } } @@ -117,12 +118,20 @@ function $Resolve( $q, $injector) { return result; } + if (parent.$$inheritedValues) { + merge(values, parent.$$inheritedValues); + } + // Merge parent values if the parent has already resolved, or merge // parent promises and wait if the parent resolve is still in progress. if (parent.$$values) { merged = merge(values, parent.$$values); + result.$$inheritedValues = parent.$$values; done(); } else { + if (parent.$$inheritedValues) { + result.$$inheritedValues = parent.$$inheritedValues; + } extend(promises, parent.$$promises); parent.then(done, fail); } diff --git a/test/resolveSpec.js b/test/resolveSpec.js index fda9e0ecc..67117b9ed 100644 --- a/test/resolveSpec.js +++ b/test/resolveSpec.js @@ -140,6 +140,28 @@ describe("resolve", function () { expect(b.mostRecentCall.args).toEqual([ 'aa' ]); }); + it("allow access to ancestor resolves in descendent resolve blocks", inject(function ($q) { + var gPromise = $q.defer(), + gInjectable = jasmine.createSpy('gInjectable').andReturn(gPromise.promise), + pPromise = $q.defer(), + pInjectable = jasmine.createSpy('pInjectable').andReturn(pPromise.promise); + + var g = $r.resolve({ gP: [ gInjectable ] }, g); + + gPromise.resolve('grandparent'); + tick(); + + var s = jasmine.createSpy('s'); + var p = $r.resolve({ p: [ pInjectable ] }, g); + var c = $r.resolve({ c: [ 'p', 'gP', s ] }, p); + + pPromise.resolve('parent'); + tick(); + + expect(s).toHaveBeenCalled(); + expect(s.mostRecentCall.args).toEqual([ 'parent', 'grandparent' ]); + })); + it("allows a function to override a parent value of the same name", function () { var r = $r.resolve({ b: function() { return 'B' } }); var s = $r.resolve({