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 library observe.src.observer_transform; | |
6 | |
7 import 'package:observe/observe.dart'; | |
8 | |
9 /// ObserverTransform is used to dynamically transform observed value(s). | |
10 /// | |
11 /// var obj = new ObservableBox(10); | |
12 /// var observer = new PathObserver(obj, 'value'); | |
13 /// var transform = new ObserverTransform(observer, | |
14 /// (x) => x * 2, setValue: (x) => x ~/ 2); | |
15 /// | |
16 /// // Open returns the current value of 20. | |
17 /// transform.open((newValue) => print('new: $newValue')); | |
18 /// | |
19 /// obj.value = 20; // prints 'new: 40' async | |
20 /// new Future(() { | |
21 /// transform.value = 4; // obj.value will be 2 | |
22 /// }); | |
23 /// | |
24 /// ObserverTransform can also be used to reduce a set of observed values to a= | |
Siggi Cherem (dart-lang)
2014/02/03 22:52:48
remove "="
Jennifer Messerly
2014/02/04 00:33:06
Done.
| |
25 /// single value: | |
26 /// | |
27 /// var obj = new ObservableMap.from({'a': 1, 'b': 2, 'c': 3}); | |
28 /// var observer = new CompoundObserver() | |
29 /// ..addPath(obj, 'a') | |
30 /// ..addPath(obj, 'b') | |
31 /// ..addPath(obj, 'c'); | |
32 /// | |
33 /// var transform = new ObserverTransform(observer, | |
34 /// (values) => values.fold(0, (x, y) => x + y)); | |
35 /// | |
36 /// // Open returns the current value of 6. | |
37 /// transform.open((newValue) => print('new: $newValue')); | |
38 /// | |
39 /// obj['a'] = 2; | |
40 /// obj['c'] = 10; // will print 'new 14' asynchronously | |
41 /// | |
42 class ObserverTransform extends Bindable { | |
43 Bindable _bindable; | |
44 Function _getValue, _setValue; | |
45 Function _notifyCallback; | |
46 var _value; | |
47 | |
48 ObserverTransform(Bindable bindable, computeValue(value), {setValue(value)}) | |
49 : _bindable = bindable, _getValue = computeValue, _setValue = setValue; | |
50 | |
51 open(callback(value)) { | |
52 _notifyCallback = callback; | |
53 _value = _getValue(_bindable.open(_observedCallback)); | |
54 return _value; | |
55 } | |
56 | |
57 _observedCallback(value) { | |
58 value = _getValue(value); | |
Siggi Cherem (dart-lang)
2014/02/03 22:52:48
Consider introducing a new variable here:
var tra
Jennifer Messerly
2014/02/04 00:33:06
sure
| |
59 if (value == _value) return null; | |
60 _value = value; | |
61 return _notifyCallback(value); | |
62 } | |
63 | |
64 void close() { | |
65 if (_bindable != null) _bindable.close(); | |
66 _bindable = null; | |
67 _getValue = null; | |
68 _setValue = null; | |
69 _notifyCallback = null; | |
70 _value = null; | |
71 } | |
72 | |
73 get value { | |
Siggi Cherem (dart-lang)
2014/02/03 22:52:48
not sure if I like this suggestion, but here it go
Jennifer Messerly
2014/02/04 00:33:06
Done.
| |
74 _value = _getValue(_bindable.value); | |
75 return _value; | |
76 } | |
77 | |
78 set value(newValue) { | |
79 if (_setValue != null) { | |
80 newValue = _setValue(newValue); | |
81 } | |
Siggi Cherem (dart-lang)
2014/02/03 22:52:48
mmm, I was expecting that if _setValue == null, th
Jennifer Messerly
2014/02/04 00:33:06
we still want to pass on the value, just we don't
| |
82 _bindable.value = newValue; | |
83 } | |
84 } | |
OLD | NEW |