Skip to content
This repository was archived by the owner on Mar 13, 2018. It is now read-only.

Commit a2e5695

Browse files
committed
Refactor: expression.setValue/getValue
This is work towards allowing expression arguments to be dynamic. R=arv BUG= Review URL: https://codereview.appspot.com/33540043
1 parent d72755a commit a2e5695

File tree

1 file changed

+24
-24
lines changed

1 file changed

+24
-24
lines changed

src/polymer-expressions.js

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,8 @@
167167
return this.object_ = f.apply(null, argumentValues);
168168
},
169169

170-
toDOM: function(fn) {
171-
var object = this.object;
172-
return function(values) {
173-
var value = fn(values);
174-
return object.toDOM(value);
175-
};
170+
toDOM: function(value) {
171+
return this.object.toDOM(value);
176172
},
177173

178174
toModel: function(value) {
@@ -344,32 +340,31 @@
344340
if (!delegate.expression && !delegate.labeledStatements.length)
345341
throw Error('No expression or labelled statements found.');
346342

347-
// TODO(rafaelw): This is a bit of hack. We'd like to support syntax for
348-
// binding to class like class="{{ foo: bar; baz: bat }}", so we're
349-
// abusing ECMAScript labelled statements for this use. The main downside
350-
// is that ECMAScript indentifiers are more limited than CSS classnames.
351343
this.expression = delegate.expression;
344+
getFn(this.expression); // forces enumeration of path dependencies
352345

353-
var resolveFn = delegate.labeledStatements.length ?
354-
newLabeledResolve(delegate.labeledStatements) :
355-
getFn(delegate.expression);
356-
357-
delegate.filters.forEach(function(filter) {
358-
resolveFn = filter.toDOM(resolveFn);
359-
});
360-
361-
this.resolveFn = resolveFn;
362346
this.paths = delegate.depsList;
363347
this.filters = delegate.filters;
348+
349+
// TODO(rafaelw): This is a bit of hack. We'd like to support syntax for
350+
// binding to class like class="{{ foo: bar; baz: bat }}", so we're
351+
// abusing ECMAScript labelled statements for this use. The main downside
352+
// is that ECMAScript indentifiers are more limited than CSS classnames.
353+
if (delegate.labeledStatements.length)
354+
this.expression = newLabeledResolve(delegate.labeledStatements);
364355
}
365356

366357
Expression.prototype = {
367358
getBinding: function(model) {
368359
var paths = this.paths;
369360
if (!paths.length)
370-
return { value: this.resolveFn({}) }; // only literals in expression.
361+
return { value: this.getValue() }; // only literals in expression.
371362

372363
var self = this;
364+
var valueFn = function(values) {
365+
return self.getValue(values);
366+
};
367+
373368
var setValueFn = function(newValue) {
374369
var values;
375370
if (self.paths.length == 1) {
@@ -384,13 +379,11 @@
384379
};
385380

386381
if (paths.length === 1) {
387-
return new PathObserver(model, paths[0], undefined, undefined,
388-
this.resolveFn,
382+
return new PathObserver(model, paths[0], undefined, undefined, valueFn,
389383
setValueFn);
390384
}
391385

392-
var binding = new CompoundPathObserver(undefined, undefined,
393-
this.resolveFn,
386+
var binding = new CompoundPathObserver(undefined, undefined, valueFn,
394387
setValueFn);
395388

396389
for (var i = 0; i < paths.length; i++) {
@@ -401,6 +394,13 @@
401394
return binding;
402395
},
403396

397+
getValue: function(depsValues) {
398+
var value = getFn(this.expression)(depsValues);
399+
for (var i = 0; i < this.filters.length; i++)
400+
value = this.filters[i].toDOM(value);
401+
return value;
402+
},
403+
404404
setValue: function(model, newValue, depsValues) {
405405
var count = this.filters ? this.filters.length : 0;
406406
while (count-- > 0) {

0 commit comments

Comments
 (0)