fix(compiler): use event names for matching directives

Closes #6870
This commit is contained in:
vsavkin 2016-02-03 11:35:42 -08:00 committed by Brian Ford
parent e725542703
commit 231773ea76
3 changed files with 34 additions and 2 deletions

View File

@ -433,8 +433,9 @@ class TemplateParseVisitor implements HtmlAstVisitor {
var parts = splitAtColon(name, [null, name]);
var target = parts[0];
var eventName = parts[1];
targetEvents.push(new BoundEventAst(eventName, target,
this._parseAction(expression, sourceSpan), sourceSpan));
var ast = this._parseAction(expression, sourceSpan);
targetMatchableAttrs.push([name, ast.source]);
targetEvents.push(new BoundEventAst(eventName, target, ast, sourceSpan));
// Don't detect directives for event names for now,
// so don't add the event name to the matchableAttrs
}

View File

@ -327,6 +327,15 @@ export function main() {
]);
});
it('should locate directives in event bindings', () => {
var dirA = CompileDirectiveMetadata.create(
{selector: '[a]', type: new CompileTypeMetadata({name: 'DirB'})});
expect(humanizeTplAst(parse('<div (a)="b">', [dirA])))
.toEqual(
[[ElementAst, 'div'], [BoundEventAst, 'a', null, 'b'], [DirectiveAst, dirA]]);
});
it('should parse directive host properties', () => {
var dirA = CompileDirectiveMetadata.create({
selector: 'div',

View File

@ -448,6 +448,21 @@ function declareTests() {
});
}));
it('should support directives where a selector matches event binding',
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
tcb.overrideView(
MyComp,
new ViewMetadata(
{template: '<p (customEvent)="doNothing()"></p>', directives: [EventDir]}))
.createAsync(MyComp)
.then((fixture) => {
var tc = fixture.debugElement.children[0];
expect(tc.inject(EventDir)).not.toBe(null);
async.done();
});
}));
it('should read directives metadata from their binding token',
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
tcb.overrideView(MyComp, new ViewMetadata({
@ -2133,6 +2148,13 @@ class IdDir {
id: string;
}
@Directive({selector: '[customEvent]'})
@Injectable()
class EventDir {
@Output() customEvent = new EventEmitter();
doSomething() {}
}
@Directive({selector: '[static]'})
@Injectable()
class NeedsAttribute {