Index: pkg/template_binding/lib/src/element.dart |
diff --git a/pkg/template_binding/lib/src/element.dart b/pkg/template_binding/lib/src/element.dart |
index 1ee43f9317cab70eefa81464d32ba762bc29a58b..bf9a036123ae94b34be2ee5f0f9381d4fbcf3e0e 100644 |
--- a/pkg/template_binding/lib/src/element.dart |
+++ b/pkg/template_binding/lib/src/element.dart |
@@ -8,76 +8,63 @@ part of template_binding; |
class _ElementExtension extends NodeBindExtension { |
_ElementExtension(Element node) : super._(node); |
- NodeBinding bind(String name, model, [String path]) { |
+ bind(String name, value, {bool oneTime: false}) { |
justinfagnani
2014/02/04 20:16:08
what's the point of returning the value? can we an
Jennifer Messerly
2014/02/04 23:00:31
This is a question for https://github.com/polymer/
justinfagnani
2014/02/04 23:34:49
Yeah... I'm not sure I like that part of the style
Jennifer Messerly
2014/02/04 23:40:41
yeah, I try to use "void" for that, at least in pu
|
_self.unbind(name); |
- var binding; |
- if (_node is OptionElement && name == 'value') { |
+ Element node = _node; |
justinfagnani
2014/02/04 20:16:08
This won't be necessary if you also add a check fo
Jennifer Messerly
2014/02/04 23:00:31
sure, but since node is always guaranteed to be an
|
+ |
+ if (node is OptionElement && name == 'value') { |
// Note: because <option> can be a semantic template, <option> will be |
// a TemplateBindExtension sometimes. So we need to handle it here. |
- (_node as OptionElement).attributes.remove(name); |
- binding = new _OptionValueBinding(_node, model, path); |
- } else { |
- binding = new _AttributeBinding(_node, name, model, path); |
- } |
- return bindings[name] = binding; |
- } |
-} |
- |
-class _AttributeBinding extends NodeBinding { |
- final bool conditional; |
- |
- _AttributeBinding._(node, name, model, path, this.conditional) |
- : super(node, name, model, path); |
- |
- factory _AttributeBinding(Element node, name, model, path) { |
- bool conditional = name.endsWith('?'); |
- if (conditional) { |
node.attributes.remove(name); |
- name = name.substring(0, name.length - 1); |
- } |
- return new _AttributeBinding._(node, name, model, path, conditional); |
- } |
- |
- Element get node => super.node; |
- void valueChanged(value) { |
- if (conditional) { |
- if (_toBoolean(value)) { |
- node.attributes[property] = ''; |
- } else { |
- node.attributes.remove(property); |
- } |
+ if (oneTime) return _updateOption(value); |
+ _open(value, _updateOption); |
} else { |
- // TODO(jmesserly): escape value if needed to protect against XSS. |
- // See https://github.com/polymer-project/mdv/issues/58 |
- node.attributes[property] = sanitizeBoundValue(value); |
- } |
- } |
-} |
+ bool conditional = name.endsWith('?'); |
+ if (conditional) { |
+ node.attributes.remove(name); |
justinfagnani
2014/02/04 20:16:08
.attributes will fail if Node isn't an Element. Ad
Jennifer Messerly
2014/02/04 23:00:31
it should not be possible. See the type check on t
|
+ name = name.substring(0, name.length - 1); |
+ } |
-class _OptionValueBinding extends _ValueBinding { |
- _OptionValueBinding(node, model, path) : super(node, model, path); |
+ if (oneTime) return _updateAttribute(_node, name, conditional, value); |
- OptionElement get node => super.node; |
+ _open(value, (x) => _updateAttribute(_node, name, conditional, x)); |
+ } |
+ return bindings[name] = value; |
+ } |
- void valueChanged(newValue) { |
+ void _updateOption(newValue) { |
+ OptionElement node = _node; |
var oldValue = null; |
var selectBinding = null; |
- var select = node.parent; |
+ var select = node.parentNode; |
if (select is SelectElement) { |
var valueBinding = nodeBind(select).bindings['value']; |
- if (valueBinding is _SelectBinding) { |
+ if (valueBinding is _InputBinding) { |
selectBinding = valueBinding; |
oldValue = select.value; |
} |
} |
- super.valueChanged(newValue); |
+ node.value = _sanitizeValue(newValue); |
- if (selectBinding != null && !selectBinding.closed && |
- select.value != oldValue) { |
- selectBinding.nodeValueChanged(null); |
+ if (selectBinding != null && select.value != oldValue) { |
+ selectBinding.value = select.value; |
+ } |
+ } |
+} |
+ |
+void _updateAttribute(Element node, String name, bool conditional, value) { |
+ if (conditional) { |
+ if (_toBoolean(value)) { |
+ node.attributes[name] = ''; |
+ } else { |
+ node.attributes.remove(name); |
} |
+ } else { |
+ // TODO(jmesserly): escape value if needed to protect against XSS. |
+ // See https://github.com/polymer-project/mdv/issues/58 |
+ node.attributes[name] = _sanitizeValue(value); |
} |
} |