OLD | NEW |
1 <!-- | 1 <!-- |
2 // Copyright 2014 The Chromium Authors. All rights reserved. | 2 // Copyright 2014 The Chromium Authors. All rights reserved. |
3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
5 --> | 5 --> |
6 <import src="sky-binder.sky" as="binder" /> | 6 <import src="sky-binder.sky" as="binder" /> |
7 <script> | 7 <script> |
8 var attributeConverters = { | 8 var attributeConverters = { |
9 boolean: function(value) { | 9 boolean: function(value) { |
10 if (typeof value == 'string') | 10 if (typeof value == 'string') |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 attributeChanged(attrName, oldValue, newValue) { | 153 attributeChanged(attrName, oldValue, newValue) { |
154 // override | 154 // override |
155 } | 155 } |
156 | 156 |
157 shadowRootReady() { | 157 shadowRootReady() { |
158 // override | 158 // override |
159 } | 159 } |
160 | 160 |
161 createdCallback() { | 161 createdCallback() { |
162 this.isAttached = false; | 162 this.isAttached = false; |
| 163 this.propertyBindings = null; |
| 164 this.dirtyPropertyBindings = null; |
163 this.created(); | 165 this.created(); |
164 | 166 |
165 Object.preventExtensions(this); | 167 Object.preventExtensions(this); |
166 | 168 |
167 // Invoke attributeChanged callback when element is first created too. | 169 // Invoke attributeChanged callback when element is first created too. |
168 var attributes = this.getAttributes(); | 170 var attributes = this.getAttributes(); |
169 for (var i = 0; i < attributes.length; ++i) { | 171 for (var i = 0; i < attributes.length; ++i) { |
170 var attribute = attributes[i]; | 172 var attribute = attributes[i]; |
171 this.attributeChangedCallback(attribute.name, null, attribute.value); | 173 this.attributeChangedCallback(attribute.name, null, attribute.value); |
172 } | 174 } |
(...skipping 28 matching lines...) Expand all Loading... |
201 this.attributeChanged(name, oldValue, newValue); | 203 this.attributeChanged(name, oldValue, newValue); |
202 var registration = registrations.get(this.localName); | 204 var registration = registrations.get(this.localName); |
203 var converter = registration.attributes.get(name); | 205 var converter = registration.attributes.get(name); |
204 if (converter) { | 206 if (converter) { |
205 this.notifyPropertyChanged(name, converter(oldValue), | 207 this.notifyPropertyChanged(name, converter(oldValue), |
206 converter(newValue)); | 208 converter(newValue)); |
207 } | 209 } |
208 } | 210 } |
209 | 211 |
210 notifyPropertyChanged(name, oldValue, newValue) { | 212 notifyPropertyChanged(name, oldValue, newValue) { |
| 213 if (oldValue == newValue) |
| 214 return; |
211 var notifier = Object.getNotifier(this); | 215 var notifier = Object.getNotifier(this); |
212 notifier.notify({ | 216 notifier.notify({ |
213 type: 'update', | 217 type: 'update', |
214 name: name, | 218 name: name, |
215 oldValue: oldValue, | 219 oldValue: oldValue, |
216 }); | 220 }); |
217 var handler = this[name + 'Changed']; | 221 var handler = this[name + 'Changed']; |
218 if (typeof handler == 'function') | 222 if (typeof handler == 'function') |
219 handler.call(this, oldValue, newValue); | 223 handler.call(this, oldValue, newValue); |
| 224 this.schedulePropertyBindingUpdate(name); |
| 225 } |
| 226 |
| 227 addPropertyBinding(name, binding) { |
| 228 if (!this.propertyBindings) |
| 229 this.propertyBindings = new Map(); |
| 230 this.propertyBindings.set(name, binding); |
| 231 } |
| 232 |
| 233 getPropertyBinding(name) { |
| 234 if (!this.propertyBindings) |
| 235 return null; |
| 236 return this.propertyBindings.get(name); |
| 237 } |
| 238 |
| 239 schedulePropertyBindingUpdate(name) { |
| 240 if (!this.dirtyPropertyBindings) { |
| 241 this.dirtyPropertyBindings = new Set(); |
| 242 Promise.resolve().then(this.updatePropertyBindings.bind(this)); |
| 243 } |
| 244 this.dirtyPropertyBindings.add(name); |
| 245 } |
| 246 |
| 247 updatePropertyBindings() { |
| 248 for (var name of this.dirtyPropertyBindings) { |
| 249 var binding = this.getPropertyBinding(name); |
| 250 if (binding) { |
| 251 binding.setValue(this[name]); |
| 252 binding.discardChanges(); |
| 253 } |
| 254 } |
| 255 this.dirtyPropertyBindings = null; |
220 } | 256 } |
221 }; | 257 }; |
222 | 258 |
223 module.exports = SkyElement; | 259 module.exports = SkyElement; |
224 </script> | 260 </script> |
OLD | NEW |