Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Unified Diff: pkg/template_binding/lib/src/element.dart

Issue 132403010: big update to observe, template_binding, polymer (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}
}

Powered by Google App Engine
This is Rietveld 408576698