Index: pkg/template_binding/test/template_binding_test.dart |
diff --git a/pkg/template_binding/test/template_binding_test.dart b/pkg/template_binding/test/template_binding_test.dart |
index 375d3d64e8e8d0e59af191952daf8fc6f3a07a05..de7e8c37af7f783668f6f50f0c25fa84ef6a87c0 100644 |
--- a/pkg/template_binding/test/template_binding_test.dart |
+++ b/pkg/template_binding/test/template_binding_test.dart |
@@ -397,6 +397,59 @@ templateInstantiationTests() { |
}); |
}); |
+ test('Bind If minimal discardChanges', () { |
+ var div = createTestHtml( |
+ '<template bind="{{bound}}" if="{{predicate}}">value:{{ value }}' |
+ '</template>'); |
+ // Dart Note: bound changed from null->{}. |
+ var m = toObservable({ 'bound': {}, 'predicate': null }); |
+ var template = div.firstChild; |
+ |
+ var discardChangesCalled = { 'bound': 0, 'predicate': 0 }; |
+ templateBind(template) |
+ ..model = m |
+ ..bindingDelegate = |
+ new BindIfMinimalDiscardChanges(discardChangesCalled); |
+ |
+ return new Future(() { |
+ expect(discardChangesCalled['bound'], 0); |
+ expect(discardChangesCalled['predicate'], 0); |
+ expect(div.childNodes.length, 1); |
+ m['predicate'] = 1; |
+ }).then(endOfMicrotask).then((_) { |
+ expect(discardChangesCalled['bound'], 1); |
+ expect(discardChangesCalled['predicate'], 0); |
+ |
+ expect(div.nodes.length, 2); |
+ expect(div.lastChild.text, 'value:'); |
+ |
+ m['bound'] = toObservable({'value': 2}); |
+ }).then(endOfMicrotask).then((_) { |
+ expect(discardChangesCalled['bound'], 1); |
+ expect(discardChangesCalled['predicate'], 1); |
+ |
+ expect(div.nodes.length, 2); |
+ expect(div.lastChild.text, 'value:2'); |
+ |
+ m['bound']['value'] = 3; |
+ |
+ }).then(endOfMicrotask).then((_) { |
+ expect(discardChangesCalled['bound'], 1); |
+ expect(discardChangesCalled['predicate'], 1); |
+ |
+ expect(div.nodes.length, 2); |
+ expect(div.lastChild.text, 'value:3'); |
+ |
+ templateBind(template).model = null; |
+ }).then(endOfMicrotask).then((_) { |
+ expect(discardChangesCalled['bound'], 1); |
+ expect(discardChangesCalled['predicate'], 1); |
+ |
+ expect(div.nodes.length, 1); |
+ }); |
+ }); |
+ |
+ |
test('Empty-If', () { |
var div = createTestHtml('<template if>{{ value }}</template>'); |
var template = div.firstChild; |
@@ -2643,6 +2696,29 @@ class Issue18Syntax extends BindingDelegate { |
} |
} |
+class BindIfMinimalDiscardChanges extends BindingDelegate { |
+ Map<String, int> discardChangesCalled; |
+ |
+ BindIfMinimalDiscardChanges(this.discardChangesCalled) : super() {} |
+ |
+ prepareBinding(path, name, node) { |
+ return (model, node, oneTime) => |
+ new DiscardCountingPathObserver(discardChangesCalled, model, path); |
+ } |
+} |
+ |
+class DiscardCountingPathObserver extends PathObserver { |
+ Map<String, int> discardChangesCalled; |
+ |
+ DiscardCountingPathObserver(this.discardChangesCalled, model, path) |
+ : super(model, path) {} |
+ |
+ get value { |
+ discardChangesCalled[path.toString()]++; |
+ return super.value; |
+ } |
+} |
+ |
class TestAccessorModel extends Observable { |
@observable var value = 1; |
var count = 0; |