@@ -220,7 +220,8 @@ class TemplateParseVisitor implements HtmlAstVisitor {
220220 parsedElement =
221221 new NgContentAst ( this . ngContentCount ++ , elementNgContentIndex , element . sourceInfo ) ;
222222 } else if ( isTemplateElement ) {
223- this . _assertNoComponentsNorElementBindingsOnTemplate ( directives , elementProps , events ,
223+ this . _assertAllEventsPublishedByDirectives ( directives , events , element . sourceInfo ) ;
224+ this . _assertNoComponentsNorElementBindingsOnTemplate ( directives , elementProps ,
224225 element . sourceInfo ) ;
225226 parsedElement = new EmbeddedTemplateAst ( attrs , vars , directives , children ,
226227 elementNgContentIndex , element . sourceInfo ) ;
@@ -239,7 +240,7 @@ class TemplateParseVisitor implements HtmlAstVisitor {
239240 var templateElementProps : BoundElementPropertyAst [ ] = this . _createElementPropertyAsts (
240241 element . name , templateElementOrDirectiveProps , templateDirectives ) ;
241242 this . _assertNoComponentsNorElementBindingsOnTemplate ( templateDirectives , templateElementProps ,
242- [ ] , element . sourceInfo ) ;
243+ element . sourceInfo ) ;
243244 parsedElement = new EmbeddedTemplateAst ( [ ] , templateVars , templateDirectives , [ parsedElement ] ,
244245 component . findNgContentIndex ( templateCssSelector ) ,
245246 element . sourceInfo ) ;
@@ -567,7 +568,6 @@ class TemplateParseVisitor implements HtmlAstVisitor {
567568
568569 private _assertNoComponentsNorElementBindingsOnTemplate ( directives : DirectiveAst [ ] ,
569570 elementProps : BoundElementPropertyAst [ ] ,
570- events : BoundEventAst [ ] ,
571571 sourceInfo : string ) {
572572 var componentTypeNames : string [ ] = this . _findComponentDirectiveNames ( directives ) ;
573573 if ( componentTypeNames . length > 0 ) {
@@ -578,9 +578,20 @@ class TemplateParseVisitor implements HtmlAstVisitor {
578578 this . _reportError (
579579 `Property binding ${ prop . name } not used by any directive on an embedded template in ${ prop . sourceInfo } ` ) ;
580580 } ) ;
581+ }
582+
583+ private _assertAllEventsPublishedByDirectives ( directives : DirectiveAst [ ] , events : BoundEventAst [ ] ,
584+ sourceInfo : string ) {
585+ var allDirectiveEvents = new Set < string > ( ) ;
586+ directives . forEach ( directive => {
587+ StringMapWrapper . forEach ( directive . directive . outputs ,
588+ ( eventName , _ ) => { allDirectiveEvents . add ( eventName ) ; } ) ;
589+ } ) ;
581590 events . forEach ( event => {
582- this . _reportError (
583- `Event binding ${ event . name } on an embedded template in ${ event . sourceInfo } ` ) ;
591+ if ( isPresent ( event . target ) || ! SetWrapper . has ( allDirectiveEvents , event . name ) ) {
592+ this . _reportError (
593+ `Event binding ${ event . fullName } not emitted by any directive on an embedded template in ${ sourceInfo } ` ) ;
594+ }
584595 } ) ;
585596 }
586597}
0 commit comments