Skip to content

Commit df34e20

Browse files
committed
fix($resolve): Resolves only inherit from immediate parent
fixes #702
1 parent 5e88789 commit df34e20

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/resolve.js

+9
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ function $Resolve( $q, $injector) {
102102
if (!merged) merge(values, parent.$$values);
103103
result.$$values = values;
104104
result.$$promises = true; // keep for isResolve()
105+
delete result.$$inheritedValues;
105106
resolution.resolve(values);
106107
}
107108
}
@@ -117,12 +118,20 @@ function $Resolve( $q, $injector) {
117118
return result;
118119
}
119120

121+
if (parent.$$inheritedValues) {
122+
merge(values, parent.$$inheritedValues);
123+
}
124+
120125
// Merge parent values if the parent has already resolved, or merge
121126
// parent promises and wait if the parent resolve is still in progress.
122127
if (parent.$$values) {
123128
merged = merge(values, parent.$$values);
129+
result.$$inheritedValues = parent.$$values;
124130
done();
125131
} else {
132+
if (parent.$$inheritedValues) {
133+
result.$$inheritedValues = parent.$$inheritedValues;
134+
}
126135
extend(promises, parent.$$promises);
127136
parent.then(done, fail);
128137
}

test/resolveSpec.js

+22
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,28 @@ describe("resolve", function () {
140140
expect(b.mostRecentCall.args).toEqual([ 'aa' ]);
141141
});
142142

143+
it("allow access to ancestor resolves in descendent resolve blocks", inject(function ($q) {
144+
var gPromise = $q.defer(),
145+
gInjectable = jasmine.createSpy('gInjectable').andReturn(gPromise.promise),
146+
pPromise = $q.defer(),
147+
pInjectable = jasmine.createSpy('pInjectable').andReturn(pPromise.promise);
148+
149+
var g = $r.resolve({ gP: [ gInjectable ] }, g);
150+
151+
gPromise.resolve('grandparent');
152+
tick();
153+
154+
var s = jasmine.createSpy('s');
155+
var p = $r.resolve({ p: [ pInjectable ] }, g);
156+
var c = $r.resolve({ c: [ 'p', 'gP', s ] }, p);
157+
158+
pPromise.resolve('parent');
159+
tick();
160+
161+
expect(s).toHaveBeenCalled();
162+
expect(s.mostRecentCall.args).toEqual([ 'parent', 'grandparent' ]);
163+
}));
164+
143165
it("allows a function to override a parent value of the same name", function () {
144166
var r = $r.resolve({ b: function() { return 'B' } });
145167
var s = $r.resolve({

0 commit comments

Comments
 (0)