1
1
var Cache = require ( '../cache' )
2
2
var config = require ( '../config' )
3
+ var dirParser = require ( './directive' )
3
4
var regexEscapeRE = / [ - . * + ? ^ $ { } ( ) | [ \] \/ \\ ] / g
4
5
var cache , tagRE , htmlRE , firstChar , lastChar
5
6
@@ -106,6 +107,8 @@ exports.parse = function (text) {
106
107
107
108
/**
108
109
* Format a list of tokens into an expression.
110
+ * e.g. tokens parsed from 'a {{b}} c' can be serialized
111
+ * into one single expression as '"a " + b + " c"'.
109
112
*
110
113
* @param {Array } tokens
111
114
* @param {Vue } [vm]
@@ -115,23 +118,61 @@ exports.parse = function (text) {
115
118
exports . tokensToExp = function ( tokens , vm ) {
116
119
return tokens . length > 1
117
120
? tokens . map ( function ( token ) {
118
- return formatToken ( token , vm )
119
- } ) . join ( '+' )
120
- : formatToken ( tokens [ 0 ] , vm )
121
+ return formatToken ( token , vm )
122
+ } ) . join ( '+' )
123
+ : formatToken ( tokens [ 0 ] , vm , true )
121
124
}
122
125
123
126
/**
124
127
* Format a single token.
125
128
*
126
129
* @param {Object } token
127
130
* @param {Vue } [vm]
131
+ * @param {Boolean } single
128
132
* @return {String }
129
133
*/
130
134
131
- function formatToken ( token , vm ) {
135
+ function formatToken ( token , vm , single ) {
132
136
return token . tag
133
137
? vm && token . oneTime
134
- ? '"' + vm . $get ( token . value ) + '"'
135
- : '(' + token . value + ')'
138
+ ? '"' + vm . $eval ( token . value ) + '"'
139
+ : single
140
+ ? token . value
141
+ : inlineFilters ( token . value )
136
142
: '"' + token . value + '"'
143
+ }
144
+
145
+ /**
146
+ * For an attribute with multiple interpolation tags,
147
+ * e.g. attr="some-{{thing | filter}}", in order to combine
148
+ * the whole thing into a single watchable expression, we
149
+ * have to inline those filters. This function does exactly
150
+ * that. This is a bit hacky but it avoids heavy changes
151
+ * to directive parser and watcher mechanism.
152
+ *
153
+ * @param {String } exp
154
+ * @return {String }
155
+ */
156
+
157
+ var filterRE = / [ ^ | ] \| [ ^ | ] /
158
+ function inlineFilters ( exp ) {
159
+ if ( ! filterRE . test ( exp ) ) {
160
+ return '(' + exp + ')'
161
+ } else {
162
+ var dir = dirParser . parse ( exp ) [ 0 ]
163
+ if ( ! dir . filters ) {
164
+ return '(' + exp + ')'
165
+ } else {
166
+ exp = dir . expression
167
+ for ( var i = 0 , l = dir . filters . length ; i < l ; i ++ ) {
168
+ var filter = dir . filters [ i ]
169
+ var args = filter . args
170
+ ? ',"' + filter . args . join ( '","' ) + '"'
171
+ : ''
172
+ exp = 'this.$options.filters["' + filter . name + '"]' +
173
+ '.apply(this,[' + exp + args + '])'
174
+ }
175
+ return exp
176
+ }
177
+ }
137
178
}
0 commit comments