Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit dcaea5f

Browse files
committed
WIP: remove compute, use $parse, remove scope.$eval
1 parent fa25467 commit dcaea5f

File tree

2 files changed

+32
-35
lines changed

2 files changed

+32
-35
lines changed

src/ng/interpolate.js

+7-8
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,18 @@ function $InterpolateProvider() {
114114
* result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,
115115
* trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that
116116
* provides Strict Contextual Escaping for details.
117-
* @returns {function(scope)} an interpolation function which is used to compute the
117+
* @returns {function(context)} an interpolation function which is used to compute the
118118
* interpolated string. The function has these parameters:
119119
*
120-
* - `scope`: a Scope instance against which any expressions embedded in the strings are
121-
* evaluated.
120+
* - `context`: evaluation context for all expressions embedded in the interpolated text
122121
*/
123122
function $interpolate(text, mustHaveExpression, trustedContext) {
124123
var startIndex,
125124
endIndex,
126125
index = 0,
127126
separators = [],
128127
expressions = [],
128+
parseFns = [],
129129
textLength = text.length,
130130
hasInterpolation = false,
131131
hasText = false,
@@ -139,6 +139,7 @@ function $InterpolateProvider() {
139139
separators.push(text.substring(index, startIndex));
140140
exp = text.substring(startIndex + startSymbolLength, endIndex);
141141
expressions.push(exp);
142+
parseFns.push($parse(exp));
142143
index = endIndex + endSymbolLength;
143144
hasInterpolation = true;
144145
} else {
@@ -182,7 +183,7 @@ function $InterpolateProvider() {
182183
return concat.join('');
183184
};
184185

185-
return extend(function interpolationFn(scope) {
186+
return extend(function interpolationFn(context) {
186187
var i = 0;
187188
var ii = expressions.length;
188189
var values = new Array(ii);
@@ -191,7 +192,7 @@ function $InterpolateProvider() {
191192

192193
try {
193194
for (; i < ii; i++) {
194-
val = scope.$eval(expressions[i]);
195+
val = parseFns[i](context);
195196
if (val !== lastValues[i]) {
196197
inputsChanged = true;
197198
}
@@ -213,9 +214,7 @@ function $InterpolateProvider() {
213214
// all of these properties are undocumented for now
214215
exp: text, //just for compatibility with regular watchers created via $watch
215216
separators: separators,
216-
expressions: expressions,
217-
// TODO(i): remove. don't expose this at all. requires changing many tests
218-
compute: compute
217+
expressions: expressions
219218
});
220219
}
221220

test/ng/interpolateSpec.js

+25-27
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
describe('$interpolate', function() {
44

55
it('should return the interpolation object when there are no bindings and textOnly is undefined',
6-
inject(function($interpolate, $rootScope) {
6+
inject(function($interpolate) {
77
var interpolateFn = $interpolate('some text');
88

99
expect(interpolateFn.exp).toBe('some text');
1010
expect(interpolateFn.separators).toEqual(['some text']);
1111
expect(interpolateFn.expressions).toEqual([]);
1212

1313
expect(interpolateFn({})).toBe('some text');
14-
expect(interpolateFn.compute([])).toBe('some text');
1514
}));
1615

1716

@@ -21,15 +20,15 @@ describe('$interpolate', function() {
2120
}));
2221

2322
it('should suppress falsy objects', inject(function($interpolate) {
24-
expect($interpolate('{{undefined}}').compute([undefined])).toEqual('');
25-
expect($interpolate('{{null}}').compute([null])).toEqual('');
26-
expect($interpolate('{{a.b}}').compute([undefined])).toEqual('');
23+
expect($interpolate('{{undefined}}')({})).toEqual('');
24+
expect($interpolate('{{null}}')({})).toEqual('');
25+
expect($interpolate('{{a.b}}')({})).toEqual('');
2726
}));
2827

2928
it('should jsonify objects', inject(function($interpolate) {
30-
expect($interpolate('{{ {} }}').compute([{}])).toEqual('{}');
31-
expect($interpolate('{{ true }}').compute([true])).toEqual('true');
32-
expect($interpolate('{{ false }}').compute([false])).toEqual('false');
29+
expect($interpolate('{{ {} }}')({})).toEqual('{}');
30+
expect($interpolate('{{ true }}')({})).toEqual('true');
31+
expect($interpolate('{{ false }}')({})).toEqual('false');
3332
}));
3433

3534

@@ -44,12 +43,11 @@ describe('$interpolate', function() {
4443
scope.name = 'Bubu';
4544

4645
expect(interpolateFn(scope)).toBe('Hello Bubu!');
47-
expect(interpolateFn.compute(['Bubu'])).toBe('Hello Bubu!');
4846
}));
4947

5048

5149
it('should ignore undefined model', inject(function($interpolate) {
52-
expect($interpolate("Hello {{'World'}}{{foo}}").compute(['World'])).toBe('Hello World');
50+
expect($interpolate("Hello {{'World'}}{{foo}}")({})).toBe('Hello World');
5351
}));
5452

5553

@@ -85,12 +83,12 @@ describe('$interpolate', function() {
8583

8684
it('should interpolate trusted expressions in a regular context', inject(function($interpolate) {
8785
var foo = sce.trustAsCss("foo");
88-
expect($interpolate('{{foo}}', true).compute([foo])).toEqual('foo');
86+
expect($interpolate('{{foo}}', true)({foo: foo})).toBe('foo');
8987
}));
9088

9189
it('should interpolate trusted expressions in a specific trustedContext', inject(function($interpolate) {
9290
var foo = sce.trustAsCss("foo");
93-
expect($interpolate('{{foo}}', true, sce.CSS).compute([foo])).toEqual('foo');
91+
expect($interpolate('{{foo}}', true, sce.CSS)({foo: foo})).toBe('foo');
9492
}));
9593

9694
// The concatenation of trusted values does not necessarily result in a trusted value. (For
@@ -100,7 +98,7 @@ describe('$interpolate', function() {
10098
var foo = sce.trustAsCss("foo");
10199
var bar = sce.trustAsCss("bar");
102100
expect(function() {
103-
return $interpolate('{{foo}}{{bar}}', true, sce.CSS).compute([foo, bar]);
101+
return $interpolate('{{foo}}{{bar}}', true, sce.CSS)({foo: foo, bar: bar});
104102
}).toThrowMinErr(
105103
"$interpolate", "noconcat", "Error while interpolating: {{foo}}{{bar}}\n" +
106104
"Strict Contextual Escaping disallows interpolations that concatenate multiple " +
@@ -119,8 +117,8 @@ describe('$interpolate', function() {
119117
it('should not get confused with same markers', inject(function($interpolate) {
120118
expect($interpolate('---').separators).toEqual(['---']);
121119
expect($interpolate('---').expressions).toEqual([]);
122-
expect($interpolate('----').compute([])).toEqual('');
123-
expect($interpolate('--1--').compute([1])).toEqual('1');
120+
expect($interpolate('----')({})).toEqual('');
121+
expect($interpolate('--1--')({})).toEqual('1');
124122
}));
125123
});
126124

@@ -140,55 +138,55 @@ describe('$interpolate', function() {
140138
separators = interpolateFn.separators, expressions = interpolateFn.expressions;
141139
expect(separators).toEqual(['a', 'C']);
142140
expect(expressions).toEqual(['b']);
143-
expect(interpolateFn.compute([123])).toEqual('a123C');
141+
expect(interpolateFn({b: 123})).toEqual('a123C');
144142
}));
145143

146144
it('should Parse Ending Binding', inject(function($interpolate) {
147145
var interpolateFn = $interpolate("a{{b}}"),
148146
separators = interpolateFn.separators, expressions = interpolateFn.expressions;
149147
expect(separators).toEqual(['a', '']);
150148
expect(expressions).toEqual(['b']);
151-
expect(interpolateFn.compute([123])).toEqual('a123');
149+
expect(interpolateFn({b: 123})).toEqual('a123');
152150
}));
153151

154152
it('should Parse Begging Binding', inject(function($interpolate) {
155153
var interpolateFn = $interpolate("{{b}}c"),
156154
separators = interpolateFn.separators, expressions = interpolateFn.expressions;
157155
expect(separators).toEqual(['', 'c']);
158156
expect(expressions).toEqual(['b']);
159-
expect(interpolateFn.compute([123])).toEqual('123c');
157+
expect(interpolateFn({b: 123})).toEqual('123c');
160158
}));
161159

162160
it('should Parse Loan Binding', inject(function($interpolate) {
163161
var interpolateFn = $interpolate("{{b}}"),
164162
separators = interpolateFn.separators, expressions = interpolateFn.expressions;
165163
expect(separators).toEqual(['', '']);
166164
expect(expressions).toEqual(['b']);
167-
expect(interpolateFn.compute([123])).toEqual('123');
165+
expect(interpolateFn({b: 123})).toEqual('123');
168166
}));
169167

170168
it('should Parse Two Bindings', inject(function($interpolate) {
171169
var interpolateFn = $interpolate("{{b}}{{c}}"),
172170
separators = interpolateFn.separators, expressions = interpolateFn.expressions;
173171
expect(separators).toEqual(['', '', '']);
174172
expect(expressions).toEqual(['b', 'c']);
175-
expect(interpolateFn.compute([111, 222])).toEqual('111222');
173+
expect(interpolateFn({b: 111, c: 222})).toEqual('111222');
176174
}));
177175

178176
it('should Parse Two Bindings With Text In Middle', inject(function($interpolate) {
179177
var interpolateFn = $interpolate("{{b}}x{{c}}"),
180178
separators = interpolateFn.separators, expressions = interpolateFn.expressions;
181179
expect(separators).toEqual(['', 'x', '']);
182180
expect(expressions).toEqual(['b', 'c']);
183-
expect(interpolateFn.compute([111, 222])).toEqual('111x222');
181+
expect(interpolateFn({b: 111, c: 222})).toEqual('111x222');
184182
}));
185183

186184
it('should Parse Multiline', inject(function($interpolate) {
187185
var interpolateFn = $interpolate('"X\nY{{A\n+B}}C\nD"'),
188186
separators = interpolateFn.separators, expressions = interpolateFn.expressions;
189187
expect(separators).toEqual(['"X\nY', 'C\nD"']);
190188
expect(expressions).toEqual(['A\n+B']);
191-
expect(interpolateFn.compute([123])).toEqual('"X\nY123C\nD"');
189+
expect(interpolateFn({'A': 'aa', 'B': 'bb'})).toEqual('"X\nYaabbC\nD"');
192190
}));
193191
});
194192

@@ -217,9 +215,9 @@ describe('$interpolate', function() {
217215
}));
218216

219217
it('should interpolate a multi-part expression when isTrustedContext is false', inject(function($interpolate) {
220-
expect($interpolate('some/{{id}}').compute([undefined])).toEqual('some/');
221-
expect($interpolate('some/{{id}}').compute([1])).toEqual('some/1');
222-
expect($interpolate('{{foo}}{{bar}}').compute([1, 2])).toEqual('12');
218+
expect($interpolate('some/{{id}}')({})).toEqual('some/');
219+
expect($interpolate('some/{{id}}')({id: 1})).toEqual('some/1');
220+
expect($interpolate('{{foo}}{{bar}}')({foo: 1, bar: 2})).toEqual('12');
223221
}));
224222
});
225223

@@ -251,8 +249,8 @@ describe('$interpolate', function() {
251249
inject(function($interpolate) {
252250
expect($interpolate('---').separators).toEqual(['---']);
253251
expect($interpolate('---').expressions).toEqual([]);
254-
expect($interpolate('----').compute([])).toEqual('');
255-
expect($interpolate('--1--').compute([1])).toEqual('1');
252+
expect($interpolate('----')({})).toEqual('');
253+
expect($interpolate('--1--')({})).toEqual('1');
256254
});
257255
});
258256
});

0 commit comments

Comments
 (0)