@@ -24,6 +24,8 @@ function $InterpolateProvider() {
24
24
var index = 0 ;
25
25
var parts = [ ] ;
26
26
var expressions = [ ] ;
27
+ var expressionFns = [ ] ;
28
+ var expressionPositions = [ ] ;
27
29
var startIndex , endIndex , exp , expFn ;
28
30
while ( index < text . length ) {
29
31
startIndex = text . indexOf ( '{{' , index ) ;
@@ -36,26 +38,45 @@ function $InterpolateProvider() {
36
38
}
37
39
exp = text . substring ( startIndex + 2 , endIndex ) ;
38
40
expFn = $parse ( exp ) ;
39
- parts . push ( expFn ) ;
40
41
expressions . push ( exp ) ;
42
+ expressionFns . push ( expFn ) ;
43
+ expressionPositions . push ( parts . length ) ;
44
+ parts . push ( expFn ) ;
41
45
index = endIndex + 2 ;
42
46
} else {
43
47
parts . push ( unescapeText ( text . substring ( index ) ) ) ;
44
48
break ;
45
49
}
46
50
}
47
51
52
+ function compute ( values ) {
53
+ _ . forEach ( values , function ( value , i ) {
54
+ parts [ expressionPositions [ i ] ] = stringify ( value ) ;
55
+ } ) ;
56
+ return parts . join ( '' ) ;
57
+ }
58
+
59
+
48
60
if ( expressions . length || ! mustHaveExpressions ) {
49
61
return _ . extend ( function interpolationFn ( context ) {
50
- return _ . reduce ( parts , function ( result , part ) {
51
- if ( _ . isFunction ( part ) ) {
52
- return result + stringify ( part ( context ) ) ;
53
- } else {
54
- return result + part ;
55
- }
56
- } , '' ) ;
62
+ var values = _ . map ( expressionFns , function ( expressionFn ) {
63
+ return expressionFn ( context ) ;
64
+ } ) ;
65
+ return compute ( values ) ;
57
66
} , {
58
- expressions : expressions
67
+ expressions : expressions ,
68
+ $$watchDelegate : function ( scope , listener ) {
69
+ var lastValue ;
70
+ return scope . $watchGroup ( expressionFns , function ( newValues , oldValues ) {
71
+ var newValue = compute ( newValues ) ;
72
+ listener (
73
+ newValue ,
74
+ ( newValues === oldValues ? newValue : lastValue ) ,
75
+ scope
76
+ ) ;
77
+ lastValue = newValue ;
78
+ } ) ;
79
+ }
59
80
} ) ;
60
81
}
61
82
0 commit comments