@@ -264,29 +264,40 @@ class TemplateParseVisitor implements HtmlAstVisitor {
264264 this . _createElementPropertyAsts ( element . name , elementOrDirectiveProps , directives ) ;
265265 var children = htmlVisitAll ( preparsedElement . nonBindable ? NON_BINDABLE_VISITOR : this ,
266266 element . children , Component . create ( directives ) ) ;
267- var elementNgContentIndex =
268- hasInlineTemplates ? null : component . findNgContentIndex ( elementCssSelector ) ;
267+
268+ // Override the actual selector when the `ngProjectAs` attribute is provided
269+ var projectionSelector = isPresent ( preparsedElement . projectAs ) ?
270+ CssSelector . parse ( preparsedElement . projectAs ) [ 0 ] :
271+ elementCssSelector ;
272+ var ngContentIndex = component . findNgContentIndex ( projectionSelector ) ;
269273 var parsedElement ;
274+
270275 if ( preparsedElement . type === PreparsedElementType . NG_CONTENT ) {
271276 if ( isPresent ( element . children ) && element . children . length > 0 ) {
272277 this . _reportError (
273278 `<ng-content> element cannot have content. <ng-content> must be immediately followed by </ng-content>` ,
274279 element . sourceSpan ) ;
275280 }
276- parsedElement =
277- new NgContentAst ( this . ngContentCount ++ , elementNgContentIndex , element . sourceSpan ) ;
281+
282+ parsedElement = new NgContentAst (
283+ this . ngContentCount ++ , hasInlineTemplates ? null : ngContentIndex , element . sourceSpan ) ;
278284 } else if ( isTemplateElement ) {
279285 this . _assertAllEventsPublishedByDirectives ( directives , events ) ;
280286 this . _assertNoComponentsNorElementBindingsOnTemplate ( directives , elementProps ,
281287 element . sourceSpan ) ;
282- parsedElement = new EmbeddedTemplateAst ( attrs , events , vars , directives , children ,
283- elementNgContentIndex , element . sourceSpan ) ;
288+
289+ parsedElement =
290+ new EmbeddedTemplateAst ( attrs , events , vars , directives , children ,
291+ hasInlineTemplates ? null : ngContentIndex , element . sourceSpan ) ;
284292 } else {
285293 this . _assertOnlyOneComponent ( directives , element . sourceSpan ) ;
286294 var elementExportAsVars = vars . filter ( varAst => varAst . value . length === 0 ) ;
295+ let ngContentIndex =
296+ hasInlineTemplates ? null : component . findNgContentIndex ( projectionSelector ) ;
297+
287298 parsedElement =
288299 new ElementAst ( nodeName , attrs , elementProps , events , elementExportAsVars , directives ,
289- children , elementNgContentIndex , element . sourceSpan ) ;
300+ children , hasInlineTemplates ? null : ngContentIndex , element . sourceSpan ) ;
290301 }
291302 if ( hasInlineTemplates ) {
292303 var templateCssSelector = createElementCssSelector ( TEMPLATE_ELEMENT , templateMatchableAttrs ) ;
@@ -297,9 +308,9 @@ class TemplateParseVisitor implements HtmlAstVisitor {
297308 element . name , templateElementOrDirectiveProps , templateDirectives ) ;
298309 this . _assertNoComponentsNorElementBindingsOnTemplate ( templateDirectives , templateElementProps ,
299310 element . sourceSpan ) ;
300- parsedElement = new EmbeddedTemplateAst (
301- [ ] , [ ] , templateVars , templateDirectives , [ parsedElement ] ,
302- component . findNgContentIndex ( templateCssSelector ) , element . sourceSpan ) ;
311+
312+ parsedElement = new EmbeddedTemplateAst ( [ ] , [ ] , templateVars , templateDirectives ,
313+ [ parsedElement ] , ngContentIndex , element . sourceSpan ) ;
303314 }
304315 return parsedElement ;
305316 }
0 commit comments