OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of mdv; | 5 part of mdv; |
6 | 6 |
7 /** Extensions to the [SelectElement] API. */ | 7 /** Extensions to the [SelectElement] API. */ |
8 class _SelectElementExtension extends _ElementExtension { | 8 class _SelectElementExtension extends _ElementExtension { |
9 _SelectElementExtension(SelectElement node) : super(node); | 9 _SelectElementExtension(SelectElement node) : super(node); |
10 | 10 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 SelectElement get element => super.element; | 44 SelectElement get element => super.element; |
45 | 45 |
46 void valueChanged(value) { | 46 void valueChanged(value) { |
47 var newValue = _toInt(value); | 47 var newValue = _toInt(value); |
48 if (newValue <= element.length) { | 48 if (newValue <= element.length) { |
49 element.selectedIndex = newValue; | 49 element.selectedIndex = newValue; |
50 return; | 50 return; |
51 } | 51 } |
52 | 52 |
53 // The binding may wish to bind to an <option> which has not yet been | 53 // The binding may wish to bind to an <option> which has not yet been |
54 // produced by a child <template>. Delay a maximum of twice -- once for | 54 // produced by a child <template>. Furthermore, we may need to wait for |
55 // iterating <optgroup> and once for <option>. | 55 // <optgroup> iterating and then for <option>. |
56 var maxRetries = 2; | 56 // |
| 57 // Unlike the JavaScript MDV, we don't have a special "Object.observe" event |
| 58 // loop to schedule on. (See the the "ensureScheduled" function: |
| 59 // https://github.com/Polymer/mdv/commit/9a51ad7ed74a292bf71662cea28acbd151f
f65c8) |
| 60 // |
| 61 // Instead we use runAsync. Each <template repeat> needs a delay of 3: |
| 62 // * once to happen after the child _TemplateIterator is created |
| 63 // * once to be after _TemplateIterator.inputs CompoundBinding resolve |
| 64 // * once to be after _TemplateIterator._valueBinding PathObserver fires |
| 65 // And then we need to do this delay sequence twice: |
| 66 // * once for OPTGROUP |
| 67 // * once for OPTION. |
| 68 // The resulting 2 * 3 is our maxRetries. |
| 69 var maxRetries = 6; |
57 delaySetSelectedIndex() { | 70 delaySetSelectedIndex() { |
58 if (newValue > element.length && --maxRetries >= 0) { | 71 if (newValue > element.length && --maxRetries >= 0) { |
59 runAsync(delaySetSelectedIndex); | 72 runAsync(delaySetSelectedIndex); |
60 } else { | 73 } else { |
61 element.selectedIndex = newValue; | 74 element.selectedIndex = newValue; |
62 } | 75 } |
63 } | 76 } |
64 | 77 |
65 // TODO(jmesserly): we aren't matching MDV here. They schedule "model=" to | |
66 // happen async and then delay using the same scheduler. By using "runAsync" | |
67 // we're going to happen quite a bit later. | |
68 // We need to port the "ensureScheduled" function: | |
69 // https://github.com/Polymer/mdv/commit/9a51ad7ed74a292bf71662cea28acbd151f
f65c8 | |
70 runAsync(delaySetSelectedIndex); | 78 runAsync(delaySetSelectedIndex); |
71 } | 79 } |
72 | 80 |
73 void updateBinding(e) { | 81 void updateBinding(e) { |
74 binding.value = element.selectedIndex; | 82 binding.value = element.selectedIndex; |
75 } | 83 } |
76 | 84 |
77 // TODO(jmesserly,sigmund): I wonder how many bindings typically convert from | 85 // TODO(jmesserly,sigmund): I wonder how many bindings typically convert from |
78 // one type to another (e.g. value-as-number) and whether it is useful to | 86 // one type to another (e.g. value-as-number) and whether it is useful to |
79 // have something like a int/num binding converter (either as a base class or | 87 // have something like a int/num binding converter (either as a base class or |
80 // a wrapper). | 88 // a wrapper). |
81 static int _toInt(value) { | 89 static int _toInt(value) { |
82 if (value is String) return int.parse(value, onError: (_) => null); | 90 if (value is String) return int.parse(value, onError: (_) => null); |
83 return value is int ? value : null; | 91 return value is int ? value : null; |
84 } | 92 } |
85 } | 93 } |
OLD | NEW |