ChangeChildNotificationsMixin abstract class
abstract class ChangeChildNotificationsMixin implements ChangeNotificationsMixin {
/**
* Holds pending changes.
*/
ChangeSet _change;
ChangeSet _changeSync;
/**
* Internal set of listeners for change events on individual data objects.
*/
Map<dynamic, StreamSubscription> _dataListeners;
_clearChanges() {
_change = null;
_changeSync = null;
}
_clearChangesSync() {
_changeSync = null;
}
_markAdded(dynamic key, dynamic value) {
if (_change == null) {
_change = new ChangeSet();
}
if (_changeSync == null) {
_changeSync = new ChangeSet();
}
if(_onBeforeAddedController != null) _onBeforeAddedController.add(key);
_changeSync.markAdded(key, value);
_change.markAdded(key, value);
}
_markRemoved(dynamic key, dynamic value) {
if (_change == null) {
_change = new ChangeSet();
}
if (_changeSync == null) {
_changeSync = new ChangeSet();
}
if(_onBeforeRemovedController != null) _onBeforeRemovedController.add(key);
_change.markRemoved(key, value);
_changeSync.markRemoved(key, value);
}
_markChanged(dynamic key, dynamic change) {
if (_change == null) {
_change = new ChangeSet();
}
if (_changeSync == null) {
_changeSync = new ChangeSet();
}
if(change is Change) {
if(change.oldValue == undefined && _onBeforeAddedController != null)
_onBeforeAddedController.add(key);
if(change.newValue == undefined && _onBeforeRemovedController != null)
_onBeforeRemovedController.add(key);
}
_change.markChanged(key, change);
_changeSync.markChanged(key, change);
}
/**
* Starts listening to changes on [dataObj].
*/
void _addOnDataChangeListener(key, dataObj) {
if (_dataListeners == null){
_dataListeners = {};
}
if (_dataListeners.containsKey(key)) {
throw new Exception('Re-adding listener on key: $key, with dataObj: $dataObj in: $this.');
}
_dataListeners[key] = dataObj.onChangeSync.listen((changeEvent) {
_markChanged(key, changeEvent['change']);
_notify(author: changeEvent['author']);
});
}
void _removeOnDataChangeListener(key) {
if (_dataListeners == null){
return;
}
if (_dataListeners.containsKey(key)) {
_dataListeners[key].cancel();
_dataListeners.remove(key);
}
}
void _dispose() {
_closeChangeStreams();
if(_onBeforeAddedController != null) _onBeforeAddedController.close();
if(_onBeforeRemovedController != null) _onBeforeRemovedController.close();
if(_dataListeners != null) _dataListeners.forEach((K, V) => V.cancel());
}
}
Implements
Properties
final Stream<dynamic> onBeforeAdd #
inherited from ChangeNotificationsMixin
Stream populated with DataMapView events before any data object is added.
Stream<dynamic> get onBeforeAdd {
if(_onBeforeAddedController == null) {
_onBeforeAddedController =
new StreamController.broadcast(sync: true);
}
return _onBeforeAddedController.stream;
}
final Stream<dynamic> onBeforeRemove #
inherited from ChangeNotificationsMixin
Stream populated with DataMapView events before any data object is removed.
Stream<dynamic> get onBeforeRemove {
if(_onBeforeRemovedController == null) {
_onBeforeRemovedController =
new StreamController.broadcast(sync: true);
}
return _onBeforeRemovedController.stream;
}
final Stream<ChangeSet> onChange #
inherited from ChangeNotificationsMixin
Stream populated with ChangeSet events whenever the collection or any of data object contained gets changed.
Stream<ChangeSet> get onChange {
if(_onChangeController == null) {
_onChangeController =
new StreamController.broadcast();
}
return _onChangeController.stream;
}
final Stream<Map> onChangeSync #
inherited from ChangeNotificationsMixin
Stream populated with {'change': ChangeSet, 'author': dynamic} events
synchronously at the moment when the collection or any data object contained
gets changed.
Stream<Map> get onChangeSync => _onChangeSyncController.stream;