fix(view): chagned view factory to keep AstWithSource

This commit is contained in:
vsavkin 2015-04-17 16:46:49 -07:00
parent 4943c0f887
commit 56f3429cc9
3 changed files with 45 additions and 4 deletions

View File

@ -109,11 +109,11 @@ export class ProtoViewFactory {
);
// text nodes
for (var i=0; i<renderElementBinder.textBindings.length; i++) {
protoView.bindTextNode(renderElementBinder.textBindings[i].ast);
protoView.bindTextNode(renderElementBinder.textBindings[i]);
}
// element properties
MapWrapper.forEach(renderElementBinder.propertyBindings, (astWithSource, propertyName) => {
protoView.bindElementProperty(astWithSource.ast, propertyName);
protoView.bindElementProperty(astWithSource, propertyName);
});
// events
protoView.bindEvent(renderElementBinder.eventBindings, -1);
@ -136,7 +136,7 @@ export class ProtoViewFactory {
// TODO: these setters should eventually be created by change detection, to make
// it monomorphic!
var setter = reflector.setter(propertyName);
protoView.bindDirectiveProperty(i, astWithSource.ast, propertyName, setter);
protoView.bindDirectiveProperty(i, astWithSource, propertyName, setter);
});
// directive events
protoView.bindEvent(renderDirectiveMetadata.eventBindings, i);

View File

@ -248,7 +248,7 @@ export class EventBuilder extends AstTransformer {
// var adjustedAst = astWithSource.ast.visit(this);
var adjustedAst = source.ast;
var fullName = isPresent(target) ? target + EVENT_TARGET_SEPARATOR + name : name;
var result = new api.EventBinding(fullName, new ASTWithSource(adjustedAst, source.source, ''));
var result = new api.EventBinding(fullName, new ASTWithSource(adjustedAst, source.source, source.location));
var event = new Event(name, target, fullName);
if (isBlank(target)) {
ListWrapper.push(this.localEvents, event);

View File

@ -731,8 +731,49 @@ export function main() {
async.done();
});
}));
});
describe("error handling", () => {
it('should specify a location of an error that happened during change detection (text)',
inject([TestBed, AsyncTestCompleter], (tb, async) => {
tb.overrideView(MyComp, new View({
template: '{{a.b}}'
}));
tb.createView(MyComp, {context: ctx}).then((view) => {
expect(() => view.detectChanges()).toThrowError(new RegExp('{{a.b}} in MyComp'));
async.done();
})
}));
it('should specify a location of an error that happened during change detection (element property)',
inject([TestBed, AsyncTestCompleter], (tb, async) => {
tb.overrideView(MyComp, new View({
template: '<div [prop]="a.b"></div>'
}));
tb.createView(MyComp, {context: ctx}).then((view) => {
expect(() => view.detectChanges()).toThrowError(new RegExp('a.b in MyComp'));
async.done();
})
}));
it('should specify a location of an error that happened during change detection (directive property)',
inject([TestBed, AsyncTestCompleter], (tb, async) => {
tb.overrideView(MyComp, new View({
template: '<child-cmp [prop]="a.b"></child-cmp>',
directives: [ChildComp]
}));
tb.createView(MyComp, {context: ctx}).then((view) => {
expect(() => view.detectChanges()).toThrowError(new RegExp('a.b in MyComp'));
async.done();
})
}));
});
// Disabled until a solution is found, refs: