@@ -212,7 +212,8 @@ class TemplateParseVisitor implements HtmlAstVisitor {
212212 parsedElement =
213213 new NgContentAst ( this . ngContentCount ++ , elementNgContentIndex , element . sourceInfo ) ;
214214 } else if ( isTemplateElement ) {
215- this . _assertNoComponentsNorElementBindingsOnTemplate ( directives , elementProps , events ,
215+ this . _assertAllEventsPublishedByDirectives ( directives , events , element . sourceInfo ) ;
216+ this . _assertNoComponentsNorElementBindingsOnTemplate ( directives , elementProps ,
216217 element . sourceInfo ) ;
217218 parsedElement = new EmbeddedTemplateAst ( attrs , vars , directives , children ,
218219 elementNgContentIndex , element . sourceInfo ) ;
@@ -231,7 +232,7 @@ class TemplateParseVisitor implements HtmlAstVisitor {
231232 var templateElementProps : BoundElementPropertyAst [ ] = this . _createElementPropertyAsts (
232233 element . name , templateElementOrDirectiveProps , templateDirectives ) ;
233234 this . _assertNoComponentsNorElementBindingsOnTemplate ( templateDirectives , templateElementProps ,
234- [ ] , element . sourceInfo ) ;
235+ element . sourceInfo ) ;
235236 parsedElement = new EmbeddedTemplateAst ( [ ] , templateVars , templateDirectives , [ parsedElement ] ,
236237 component . findNgContentIndex ( templateCssSelector ) ,
237238 element . sourceInfo ) ;
@@ -559,7 +560,6 @@ class TemplateParseVisitor implements HtmlAstVisitor {
559560
560561 private _assertNoComponentsNorElementBindingsOnTemplate ( directives : DirectiveAst [ ] ,
561562 elementProps : BoundElementPropertyAst [ ] ,
562- events : BoundEventAst [ ] ,
563563 sourceInfo : string ) {
564564 var componentTypeNames : string [ ] = this . _findComponentDirectiveNames ( directives ) ;
565565 if ( componentTypeNames . length > 0 ) {
@@ -570,9 +570,20 @@ class TemplateParseVisitor implements HtmlAstVisitor {
570570 this . _reportError (
571571 `Property binding ${ prop . name } not used by any directive on an embedded template in ${ prop . sourceInfo } ` ) ;
572572 } ) ;
573+ }
574+
575+ private _assertAllEventsPublishedByDirectives ( directives : DirectiveAst [ ] , events : BoundEventAst [ ] ,
576+ sourceInfo : string ) {
577+ var allDirectiveEvents = new Set < string > ( ) ;
578+ directives . forEach ( directive => {
579+ StringMapWrapper . forEach ( directive . directive . outputs ,
580+ ( eventName , _ ) => { allDirectiveEvents . add ( eventName ) ; } ) ;
581+ } ) ;
573582 events . forEach ( event => {
574- this . _reportError (
575- `Event binding ${ event . name } on an embedded template in ${ event . sourceInfo } ` ) ;
583+ if ( isPresent ( event . target ) || ! SetWrapper . has ( allDirectiveEvents , event . name ) ) {
584+ this . _reportError (
585+ `Event binding ${ event . fullName } not emitted by any directive on an embedded template in ${ sourceInfo } ` ) ;
586+ }
576587 } ) ;
577588 }
578589}
0 commit comments