fix(change_detection): fixed reflect properties as attributes

Closes #3761
This commit is contained in:
vsavkin
2015-08-20 15:11:12 -07:00
committed by Victor Savkin
parent b6146394ae
commit a9ce454b21
28 changed files with 168 additions and 142 deletions
@@ -28,13 +28,13 @@ export function main() {
it("should return a proto change detector when one is available", () => {
var map = {'id': (def) => proto};
var cd = new PreGeneratedChangeDetection(map);
var cd = new PreGeneratedChangeDetection(null, map);
expect(cd.getProtoChangeDetector('id', def)).toBe(proto)
});
it("should delegate to dynamic change detection otherwise", () => {
var cd = new PreGeneratedChangeDetection({});
var cd = new PreGeneratedChangeDetection(null, {});
expect(cd.getProtoChangeDetector('id', def)).toBeAnInstanceOf(DynamicProtoChangeDetector);
});
});
@@ -66,7 +66,7 @@ export var PROP_NAME = 'propName';
* In this case, we expect `id` and `expression` to be the same string.
*/
export function getDefinition(id: string): TestDefinition {
var genConfig = new ChangeDetectorGenConfig(true, true);
var genConfig = new ChangeDetectorGenConfig(true, true, true);
var testDef = null;
if (StringMapWrapper.contains(_ExpressionWithLocals.availableDefinitions, id)) {
let val = StringMapWrapper.get(_ExpressionWithLocals.availableDefinitions, id);
@@ -110,6 +110,12 @@ export function getDefinition(id: string): TestDefinition {
var records = _createBindingRecords("a");
let cdDef = new ChangeDetectorDefinition(id, "ON_PUSH_OBSERVE", [], records, [], [], genConfig);
testDef = new TestDefinition(id, cdDef, null);
} else if (id == "updateElementProduction") {
var genConfig = new ChangeDetectorGenConfig(false, false, false);
var records = _createBindingRecords("name");
let cdDef = new ChangeDetectorDefinition(id, null, [], records, [], [], genConfig);
testDef = new TestDefinition(id, cdDef, null);
}
@@ -138,7 +144,7 @@ export function getAllDefinitions(): List<TestDefinition> {
ListWrapper.concat(allDefs, StringMapWrapper.keys(_DirectiveUpdating.availableDefinitions));
allDefs = ListWrapper.concat(allDefs, _availableEventDefinitions);
allDefs = ListWrapper.concat(allDefs, _availableHostEventDefinitions);
allDefs = ListWrapper.concat(allDefs, ["onPushObserve"]);
allDefs = ListWrapper.concat(allDefs, ["onPushObserve", "updateElementProduction"]);
return ListWrapper.map(allDefs, (id) => getDefinition(id));
}
@@ -150,7 +156,7 @@ class _ExpressionWithLocals {
var variableBindings = _convertLocalsToVariableBindings(this.locals);
var bindingRecords = _createBindingRecords(this._expression);
var directiveRecords = [];
var genConfig = new ChangeDetectorGenConfig(true, true);
var genConfig = new ChangeDetectorGenConfig(true, true, true);
return new ChangeDetectorDefinition('(empty id)', strategy, variableBindings, bindingRecords,
[], directiveRecords, genConfig);
}
@@ -210,7 +216,7 @@ class _ExpressionWithMode {
_createHostEventRecords("(host-event)='false'", dirRecordWithOnPush))
}
var genConfig = new ChangeDetectorGenConfig(true, true);
var genConfig = new ChangeDetectorGenConfig(true, true, true);
return new ChangeDetectorDefinition('(empty id)', this._strategy, variableBindings,
bindingRecords, eventRecords, directiveRecords, genConfig);
@@ -236,7 +242,7 @@ class _DirectiveUpdating {
createChangeDetectorDefinition(): ChangeDetectorDefinition {
var strategy = null;
var variableBindings = [];
var genConfig = new ChangeDetectorGenConfig(true, true);
var genConfig = new ChangeDetectorGenConfig(true, true, true);
return new ChangeDetectorDefinition('(empty id)', strategy, variableBindings,
this._bindingRecords, [], this._directiveRecords,
@@ -535,6 +535,31 @@ export function main() {
});
});
describe("logBindingUpdate", () => {
it('should be called for element updates in the dev mode', () => {
var person = new Person('bob');
var val = _createChangeDetector('name', person);
val.changeDetector.detectChanges();
expect(val.dispatcher.debugLog).toEqual(['propName=bob']);
});
it('should be called for directive updates in the dev mode', () => {
var val = _createWithoutHydrate('directNoDispatcher');
val.changeDetector.hydrate(_DEFAULT_CONTEXT, null,
new FakeDirectives([new TestDirective()], []), null);
val.changeDetector.detectChanges();
expect(val.dispatcher.debugLog).toEqual(["a=42"]);
});
it('should not be called in the prod mode', () => {
var person = new Person('bob');
var val = _createChangeDetector('updateElementProduction', person);
val.changeDetector.detectChanges();
expect(val.dispatcher.debugLog).toEqual([]);
});
});
describe('reading directives', () => {
it('should read directive properties', () => {
var directive = new TestDirective();
@@ -1123,7 +1148,8 @@ class FakeDirectives {
}
class TestDispatcher implements ChangeDispatcher {
log: List<string>;
log: string[];
debugLog: string[];
loggedValues: List<any>;
onAllChangesDoneCalled: boolean = false;
@@ -1131,6 +1157,7 @@ class TestDispatcher implements ChangeDispatcher {
clear() {
this.log = [];
this.debugLog = [];
this.loggedValues = [];
this.onAllChangesDoneCalled = true;
}
@@ -1140,6 +1167,8 @@ class TestDispatcher implements ChangeDispatcher {
this.loggedValues.push(value);
}
logBindingUpdate(target, value) { this.debugLog.push(`${target.name}=${this._asString(value)}`); }
notifyOnAllChangesDone() { this.onAllChangesDoneCalled = true; }
getDebugContext(a, b) { return null; }