OLD | NEW |
| (Empty) |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 /// Code for property accessors from declaration/properties.js | |
6 part of polymer; | |
7 | |
8 // Dart note: this matches the property defined by createPropertyAccessor in | |
9 // polymer-dev/src/declarations/properties.js. Unlike Javascript, we can't | |
10 // override the original property, so we instead ask users to write properties | |
11 // using this pattern: | |
12 // | |
13 // class Foo extends PolymerElement { | |
14 // ... | |
15 // @published | |
16 // get foo => readValue(#foo); | |
17 // set foo(v) { writeValue(#foo, v); } | |
18 // | |
19 // and internally readValue/writeValue use an instance of this type to | |
20 // implement the semantics in createPropertyAccessor. | |
21 class _PropertyAccessor<T> { | |
22 // Name of the property, in order to properly fire change notification events. | |
23 final Symbol _name; | |
24 | |
25 /// The underlying value of the property. | |
26 T _value; | |
27 | |
28 // Polymer element that contains this property, where change notifications are | |
29 // expected to be fired from. | |
30 final Polymer _target; | |
31 | |
32 /// Non-null when the property is bound. | |
33 Bindable bindable; | |
34 | |
35 _PropertyAccessor(this._name, this._target, this._value); | |
36 | |
37 /// Updates the underlyling value and fires the expected notifications. | |
38 void updateValue(T newValue) { | |
39 var oldValue = _value; | |
40 _value = _target.notifyPropertyChange(_name, oldValue, newValue); | |
41 _target.emitPropertyChangeRecord(_name, newValue, oldValue); | |
42 } | |
43 | |
44 /// The current value of the property. If the property is bound, reading this | |
45 /// property ensures that the changes are first propagated in order to return | |
46 /// the latest value. Similarly, when setting this property the binding (if | |
47 /// any) will be updated too. | |
48 T get value { | |
49 if (bindable != null) bindable.deliver(); | |
50 return _value; | |
51 } | |
52 | |
53 set value(T newValue) { | |
54 // Dart Note: The js side makes computed properties read only, and bails | |
55 // out right here for them (ignoreWrites). For us they are automatically | |
56 // read only unless you define a setter for them, so we left that out. | |
57 if (bindable != null) { | |
58 bindable.value = newValue; | |
59 } else { | |
60 updateValue(newValue); | |
61 } | |
62 } | |
63 | |
64 toString() { | |
65 var name = smoke.symbolToName(_name); | |
66 var hasBinding = bindable == null ? '(no-binding)' : '(with-binding)'; | |
67 return "[$runtimeType: $_target.$name: $_value $hasBinding]"; | |
68 } | |
69 } | |
OLD | NEW |