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

Commit de43d2f

Browse files
committed
perf($interpolate): provide a simplified result for constant expressions
1 parent 7d70dcd commit de43d2f

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

benchmarks/largetable-bp/main.html

+8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<div>interpolation + fnInvocation: <input type="radio" ng-model="benchmarkType" value="interpolationFn"></div>
2020
<div>ngBind + filter: <input type="radio" ng-model="benchmarkType" value="ngBindFilter"></div>
2121
<div>interpolation + filter: <input type="radio" ng-model="benchmarkType" value="interpolationFilter"></div>
22+
<div>ngModel: <input type="radio" ng-model="benchmarkType" value="ngModel"></div>
2223

2324
<ng-switch on="benchmarkType">
2425
<baseline-binding-table ng-switch-when="baselineBinding">
@@ -77,6 +78,13 @@ <h2>interpolation with filter</h2>
7778
<span ng-repeat="column in row">{{column.i | noop}}:{{column.j | noop}}|</span>
7879
</div>
7980
</div>
81+
<div ng-switch-when="ngModel">
82+
<h2>ngModels</h2>
83+
<div ng-repeat="row in data">
84+
<input type="text" ng-model="row.i" name="constName" />
85+
<input type="text" ng-model="row.j" />
86+
</div>
87+
</div>
8088
</ng-switch>
8189
</div>
8290
</div>

src/ng/interpolate.js

+13
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,19 @@ function $InterpolateProvider() {
183183
* - `context`: evaluation context for all expressions embedded in the interpolated text
184184
*/
185185
function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {
186+
// Provide a quick exit and simplified result function for text with no interpolation
187+
if (!text.length || text.indexOf(startSymbol) === -1) {
188+
var constantInterp;
189+
if (!mustHaveExpression) {
190+
var unescapedText = unescapeText(text);
191+
constantInterp = function constantInterpolationFn() { return unescapedText; };
192+
constantInterp.exp = text;
193+
constantInterp.constant = true;
194+
constantInterp.expressions = [];
195+
}
196+
return constantInterp;
197+
}
198+
186199
allOrNothing = !!allOrNothing;
187200
var startIndex,
188201
endIndex,

test/ng/interpolateSpec.js

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ describe('$interpolate', function() {
88

99
expect(interpolateFn.exp).toBe('some text');
1010
expect(interpolateFn.expressions).toEqual([]);
11+
expect(interpolateFn.constant).toEqual(true);
1112

1213
expect(interpolateFn({})).toBe('some text');
1314
}));
@@ -141,6 +142,7 @@ describe('$interpolate', function() {
141142

142143

143144
it('should unescape multiple expressions', inject(function($interpolate) {
145+
expect($interpolate('\\{\\{')(obj)).toBe('{{');
144146
expect($interpolate('\\{\\{foo\\}\\}\\{\\{bar\\}\\} {{foo}}')(obj)).toBe('{{foo}}{{bar}} Hello');
145147
expect($interpolate('{{foo}}\\{\\{foo\\}\\}\\{\\{bar\\}\\}')(obj)).toBe('Hello{{foo}}{{bar}}');
146148
expect($interpolate('\\{\\{foo\\}\\}{{foo}}\\{\\{bar\\}\\}')(obj)).toBe('{{foo}}Hello{{bar}}');

0 commit comments

Comments
 (0)