fix(change_detection): convert interpolated null values to empty strings

Fixes #3007

Closes #3271
This commit is contained in:
Pawel Kozlowski 2015-07-24 16:29:50 +02:00
parent 16493e9769
commit 345fa521dd
4 changed files with 25 additions and 1 deletions

View File

@ -371,7 +371,7 @@ export class ChangeDetectorJITGenerator {
for (var i = 0; i < r.args.length; ++i) {
res += JSON.stringify(r.fixedArgs[i]);
res += " + ";
res += this._localNames[r.args[i]];
res += `${UTIL}.s(${this._localNames[r.args[i]]})`;
res += " + ";
}
res += JSON.stringify(r.fixedArgs[r.args.length]);

View File

@ -151,4 +151,6 @@ export class ChangeDetectionUtil {
}
static isValueBlank(value: any): boolean { return isBlank(value); }
static s(value: any): string { return isPresent(value) ? `${value}` : ''; }
}

View File

@ -302,6 +302,15 @@ export function main() {
expect(val.dispatcher.log).toEqual(['propName=BvalueA']);
});
it('should output empty strings for null values in interpolation', () => {
var val = _createChangeDetector('interpolation', new TestData('value'));
val.changeDetector.hydrate(new TestData(null), null, null, null);
val.changeDetector.detectChanges();
expect(val.dispatcher.log).toEqual(['propName=BA']);
});
it('should escape values in literals that indicate interpolation',
() => { expect(_bindSimpleValue('"$"')).toEqual(['propName=$']); });

View File

@ -94,6 +94,19 @@ export function main() {
});
}));
it('should update text node with a blank string when interpolation evaluates to null',
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
tcb.overrideView(MyComp, new viewAnn.View({template: '<div>{{null}}{{ctxProp}}</div>'}))
.createAsync(MyComp)
.then((rootTC) => {
rootTC.componentInstance.ctxProp = null;
rootTC.detectChanges();
expect(rootTC.nativeElement).toHaveText('');
async.done();
});
}));
it('should consume element binding changes',
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
tcb.overrideView(MyComp, new viewAnn.View({template: '<div [id]="ctxProp"></div>'}))