OLD | NEW |
1 Polymer({ | 1 Polymer({ |
2 | 2 |
3 is: 'iron-autogrow-textarea', | 3 is: 'iron-autogrow-textarea', |
4 | 4 |
5 behaviors: [ | 5 behaviors: [ |
6 Polymer.IronFormElementBehavior, | 6 Polymer.IronFormElementBehavior, |
7 Polymer.IronValidatableBehavior, | 7 Polymer.IronValidatableBehavior, |
8 Polymer.IronControlState | 8 Polymer.IronControlState |
9 ], | 9 ], |
10 | 10 |
11 properties: { | 11 properties: { |
12 | 12 |
13 /** | 13 /** |
14 * Use this property instead of `value` for two-way data binding. | 14 * Use this property instead of `value` for two-way data binding. |
15 * | 15 * This property will be deprecated in the future. Use `value` instead. |
16 * @type {string|number|undefined|null} | 16 * @type {string|number} |
17 */ | 17 */ |
18 bindValue: { | 18 bindValue: { |
19 observer: '_bindValueChanged', | 19 observer: '_bindValueChanged', |
20 type: String | 20 type: String |
21 }, | 21 }, |
22 | 22 |
23 /** | 23 /** |
24 * The initial number of rows. | 24 * The initial number of rows. |
25 * | 25 * |
26 * @attribute rows | 26 * @attribute rows |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 }, | 64 }, |
65 | 65 |
66 /** | 66 /** |
67 * Bound to the textarea's `inputmode` attribute. | 67 * Bound to the textarea's `inputmode` attribute. |
68 */ | 68 */ |
69 inputmode: { | 69 inputmode: { |
70 type: String | 70 type: String |
71 }, | 71 }, |
72 | 72 |
73 /** | 73 /** |
74 * Bound to the textarea's `name` attribute. | |
75 */ | |
76 name: { | |
77 type: String | |
78 }, | |
79 | |
80 /** | |
81 * The value for this input, same as `bindValue` | |
82 */ | |
83 value: { | |
84 notify: true, | |
85 type: String, | |
86 computed: '_computeValue(bindValue)' | |
87 }, | |
88 | |
89 /** | |
90 * Bound to the textarea's `placeholder` attribute. | 74 * Bound to the textarea's `placeholder` attribute. |
91 */ | 75 */ |
92 placeholder: { | 76 placeholder: { |
93 type: String | 77 type: String |
94 }, | 78 }, |
95 | 79 |
96 /** | 80 /** |
97 * Bound to the textarea's `readonly` attribute. | 81 * Bound to the textarea's `readonly` attribute. |
98 */ | 82 */ |
99 readonly: { | 83 readonly: { |
(...skipping 13 matching lines...) Expand all Loading... |
113 maxlength: { | 97 maxlength: { |
114 type: Number | 98 type: Number |
115 } | 99 } |
116 | 100 |
117 }, | 101 }, |
118 | 102 |
119 listeners: { | 103 listeners: { |
120 'input': '_onInput' | 104 'input': '_onInput' |
121 }, | 105 }, |
122 | 106 |
| 107 observers: [ |
| 108 '_onValueChanged(value)' |
| 109 ], |
| 110 |
123 /** | 111 /** |
124 * Returns the underlying textarea. | 112 * Returns the underlying textarea. |
125 * @type HTMLTextAreaElement | 113 * @type HTMLTextAreaElement |
126 */ | 114 */ |
127 get textarea() { | 115 get textarea() { |
128 return this.$.textarea; | 116 return this.$.textarea; |
129 }, | 117 }, |
130 | 118 |
131 /** | 119 /** |
132 * Returns textarea's selection start. | 120 * Returns textarea's selection start. |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 } | 177 } |
190 | 178 |
191 // If the bindValue changed manually, then we need to also update | 179 // If the bindValue changed manually, then we need to also update |
192 // the underlying textarea's value. Otherwise this change was probably | 180 // the underlying textarea's value. Otherwise this change was probably |
193 // generated from the _onInput handler, and the two values are already | 181 // generated from the _onInput handler, and the two values are already |
194 // the same. | 182 // the same. |
195 if (textarea.value !== this.bindValue) { | 183 if (textarea.value !== this.bindValue) { |
196 textarea.value = !(this.bindValue || this.bindValue === 0) ? '' : this.b
indValue; | 184 textarea.value = !(this.bindValue || this.bindValue === 0) ? '' : this.b
indValue; |
197 } | 185 } |
198 | 186 |
| 187 this.value = this.bindValue; |
199 this.$.mirror.innerHTML = this._valueForMirror(); | 188 this.$.mirror.innerHTML = this._valueForMirror(); |
200 // manually notify because we don't want to notify until after setting val
ue | 189 // manually notify because we don't want to notify until after setting val
ue |
201 this.fire('bind-value-changed', {value: this.bindValue}); | 190 this.fire('bind-value-changed', {value: this.bindValue}); |
202 }, | 191 }, |
203 | 192 |
204 _onInput: function(event) { | 193 _onInput: function(event) { |
205 this.bindValue = event.path ? event.path[0].value : event.target.value; | 194 this.bindValue = event.path ? event.path[0].value : event.target.value; |
206 }, | 195 }, |
207 | 196 |
208 _constrain: function(tokens) { | 197 _constrain: function(tokens) { |
(...skipping 18 matching lines...) Expand all Loading... |
227 return; | 216 return; |
228 } | 217 } |
229 this.tokens = (input && input.value) ? input.value.replace(/&/gm, '&')
.replace(/"/gm, '"').replace(/'/gm, ''').replace(/</gm, '<').replace
(/>/gm, '>').split('\n') : ['']; | 218 this.tokens = (input && input.value) ? input.value.replace(/&/gm, '&')
.replace(/"/gm, '"').replace(/'/gm, ''').replace(/</gm, '<').replace
(/>/gm, '>').split('\n') : ['']; |
230 return this._constrain(this.tokens); | 219 return this._constrain(this.tokens); |
231 }, | 220 }, |
232 | 221 |
233 _updateCached: function() { | 222 _updateCached: function() { |
234 this.$.mirror.innerHTML = this._constrain(this.tokens); | 223 this.$.mirror.innerHTML = this._constrain(this.tokens); |
235 }, | 224 }, |
236 | 225 |
237 _computeValue: function() { | 226 _onValueChanged: function() { |
238 return this.bindValue; | 227 this.bindValue = this.value; |
239 } | 228 } |
240 }); | 229 }); |
OLD | NEW |