BREAKING CHANGE:
Directives that previously injected Pipes to get iterableDiff or keyvalueDiff, now should inject IterableDiffers and KeyValueDiffers.
66 lines
1.9 KiB
Dart
66 lines
1.9 KiB
Dart
library angular2.directives.observable_list_iterable_diff;
|
|
|
|
import 'package:observe/observe.dart' show ObservableList;
|
|
import 'package:angular2/change_detection.dart';
|
|
import 'package:angular2/src/change_detection/differs/default_iterable_differ.dart';
|
|
import 'dart:async';
|
|
|
|
class ObservableListDiff extends DefaultIterableDiffer {
|
|
ChangeDetectorRef _ref;
|
|
ObservableListDiff(this._ref);
|
|
|
|
bool _updated = true;
|
|
ObservableList _collection;
|
|
StreamSubscription _subscription;
|
|
|
|
onDestroy() {
|
|
if (this._subscription != null) {
|
|
this._subscription.cancel();
|
|
this._subscription = null;
|
|
this._collection = null;
|
|
}
|
|
}
|
|
|
|
dynamic diff(ObservableList collection) {
|
|
if (collection is! ObservableList) {
|
|
throw "Cannot change the type of a collection";
|
|
}
|
|
|
|
// A new collection instance is passed in.
|
|
// - We need to set up a listener.
|
|
// - We need to diff collection.
|
|
if (!identical(_collection, collection)) {
|
|
_collection = collection;
|
|
|
|
if (_subscription != null) _subscription.cancel();
|
|
_subscription = collection.changes.listen((_) {
|
|
_updated = true;
|
|
_ref.requestCheck();
|
|
});
|
|
_updated = false;
|
|
return super.diff(collection);
|
|
|
|
// An update has been registered since the last change detection check.
|
|
// - We reset the flag.
|
|
// - We diff the collection.
|
|
} else if (_updated) {
|
|
_updated = false;
|
|
return super.diff(collection);
|
|
|
|
// No updates has been registered.
|
|
// Returning this tells change detection that object has not change,
|
|
// so it should NOT update the binding.
|
|
} else {
|
|
return this;
|
|
}
|
|
}
|
|
}
|
|
|
|
class ObservableListDiffFactory implements IterableDifferFactory {
|
|
const ObservableListDiffFactory();
|
|
bool supports(obj) => obj is ObservableList;
|
|
IterableDiffer create(ChangeDetectorRef cdRef) {
|
|
return new ObservableListDiff(cdRef);
|
|
}
|
|
}
|