Skip to content

Commit 67f5e00

Browse files
fix($resolve): use resolve fn result, not parent resolved value of same name
Made resolve values ignore any keys that we're actively trying to resolve, when they also exist in some parent state. Made $$resolves persist so they can be picked up by a child state in a later digest() fixes #1317 fixes #1353
1 parent 83d6dd8 commit 67f5e00

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

src/resolve.js

+16-7
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ function $Resolve( $q, $injector) {
4141
*/
4242
this.study = function (invocables) {
4343
if (!isObject(invocables)) throw new Error("'invocables' must be an object");
44+
var invocableKeys = Object.keys(invocables || {});
4445

4546
// Perform a topological sort of invocables to build an ordered plan
4647
var plan = [], cycle = [], visited = {};
@@ -101,7 +102,7 @@ function $Resolve( $q, $injector) {
101102
if (!--wait) {
102103
if (!merged) merge(values, parent.$$values);
103104
result.$$values = values;
104-
result.$$promises = true; // keep for isResolve()
105+
result.$$promises = result.$$promises || true; // keep for isResolve()
105106
delete result.$$inheritedValues;
106107
resolution.resolve(values);
107108
}
@@ -111,28 +112,36 @@ function $Resolve( $q, $injector) {
111112
result.$$failure = reason;
112113
resolution.reject(reason);
113114
}
114-
115+
116+
// TODO: Remove this when we merge in 'new' branch
117+
function omit(obj) {
118+
var copy = {}, keys = angular.isArray(arguments[1]) ? arguments[1] : arguments.slice(1);
119+
for (var key in obj)
120+
if (keys.indexOf(key) == -1) copy[key] = obj[key];
121+
return copy;
122+
}
123+
115124
// Short-circuit if parent has already failed
116125
if (isDefined(parent.$$failure)) {
117126
fail(parent.$$failure);
118127
return result;
119128
}
120129

121130
if (parent.$$inheritedValues) {
122-
merge(values, parent.$$inheritedValues);
131+
merge(values, omit(parent.$$inheritedValues, invocableKeys));
123132
}
124133

125134
// Merge parent values if the parent has already resolved, or merge
126135
// parent promises and wait if the parent resolve is still in progress.
136+
extend(promises, parent.$$promises);
127137
if (parent.$$values) {
128-
merged = merge(values, parent.$$values);
129-
result.$$inheritedValues = parent.$$values;
138+
merged = merge(values, omit(parent.$$values, invocableKeys));
139+
result.$$inheritedValues = omit(parent.$$values, invocableKeys);
130140
done();
131141
} else {
132142
if (parent.$$inheritedValues) {
133-
result.$$inheritedValues = parent.$$inheritedValues;
143+
result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys);
134144
}
135-
extend(promises, parent.$$promises);
136145
parent.then(done, fail);
137146
}
138147

0 commit comments

Comments
 (0)