@@ -173,19 +173,43 @@ class Scope {
173
173
* controller code you will most likely use [watch] .
174
174
*/
175
175
Watch watch (expression, ReactionFn reactionFn, {context, FilterMap filters}) {
176
- assert (expression != null );
177
- AST ast = expression is AST
178
- ? expression
179
- : rootScope._astParser (expression, context: context, filters: filters);
180
- return watchGroup.watch (ast, reactionFn);
176
+ return _watch (watchGroup, expression, reactionFn, context, filters);
181
177
}
182
178
183
179
Watch observe (expression, ReactionFn reactionFn, {context, FilterMap filters}) {
180
+ return _watch (observeGroup, expression, reactionFn, context, filters);
181
+ }
182
+
183
+ Watch _watch (WatchGroup group, expression, ReactionFn reactionFn,
184
+ context, FilterMap filters) {
184
185
assert (expression != null );
185
- AST ast = expression is AST
186
- ? expression
187
- : rootScope._astParser (expression, context: context, filters: filters);
188
- return observeGroup.watch (ast, reactionFn);
186
+ AST ast;
187
+ Watch watch;
188
+ ReactionFn fn = reactionFn;
189
+ if (expression is AST ) {
190
+ ast = expression;
191
+ } else if (expression is String ) {
192
+ if (expression.startsWith ('::' )) {
193
+ expression = expression.substring (2 );
194
+ fn = (value, last) {
195
+ if (value != null ) {
196
+ watch.remove ();
197
+ return reactionFn (value, last);
198
+ }
199
+ };
200
+ } else if (expression.startsWith (':' )) {
201
+ expression = expression.substring (1 );
202
+ fn = (value, last) {
203
+ if (value != null ) {
204
+ return reactionFn (value, last);
205
+ }
206
+ };
207
+ }
208
+ ast = rootScope._astParser (expression, context: context, filters: filters);
209
+ } else {
210
+ throw 'expressions must be String or AST got $expression .' ;
211
+ }
212
+ return watch = group.watch (ast, fn);
189
213
}
190
214
191
215
dynamic eval (expression, [Map locals]) {
0 commit comments