@@ -15,7 +15,7 @@ import {ComponentDef} from './interfaces/definition';
15
15
import { NodeInjectorFactory } from './interfaces/injector' ;
16
16
import { TElementNode , TNode , TNodeFlags , TNodeType , TProjectionNode , TViewNode , unusedValueExportToPlacateAjd as unused2 } from './interfaces/node' ;
17
17
import { unusedValueExportToPlacateAjd as unused3 } from './interfaces/projection' ;
18
- import { ProceduralRenderer3 , RComment , RElement , RNode , RText , Renderer3 , isProceduralRenderer , unusedValueExportToPlacateAjd as unused4 } from './interfaces/renderer' ;
18
+ import { ProceduralRenderer3 , RElement , RNode , RText , Renderer3 , isProceduralRenderer , unusedValueExportToPlacateAjd as unused4 } from './interfaces/renderer' ;
19
19
import { CHILD_HEAD , CLEANUP , FLAGS , HookData , LView , LViewFlags , NEXT , PARENT , QUERIES , RENDERER , TVIEW , T_HOST , unusedValueExportToPlacateAjd as unused5 } from './interfaces/view' ;
20
20
import { assertNodeType } from './node_assert' ;
21
21
import { renderStringify } from './util/misc_utils' ;
@@ -558,11 +558,12 @@ function getRenderParent(tNode: TNode, currentView: LView): RElement|null {
558
558
559
559
// Skip over element and ICU containers as those are represented by a comment node and
560
560
// can't be used as a render parent.
561
- const parent = getHighestElementOrICUContainer ( tNode ) . parent ;
561
+ const parent = getHighestElementOrICUContainer ( tNode ) ;
562
+ const renderParent = parent . parent ;
562
563
563
564
// If the parent is null, then we are inserting across views: either into an embedded view or a
564
565
// component view.
565
- if ( parent == null ) {
566
+ if ( renderParent == null ) {
566
567
const hostTNode = currentView [ T_HOST ] ! ;
567
568
if ( hostTNode . type === TNodeType . View ) {
568
569
// We are inserting a root element of an embedded view We might delay insertion of children
@@ -579,10 +580,17 @@ function getRenderParent(tNode: TNode, currentView: LView): RElement|null {
579
580
return getHostNative ( currentView ) ;
580
581
}
581
582
} else {
582
- ngDevMode && assertNodeType ( parent , TNodeType . Element ) ;
583
- if ( parent . flags & TNodeFlags . isComponent ) {
583
+ const isIcuCase = parent && parent . type === TNodeType . IcuContainer ;
584
+ // If the parent of this node is an ICU container, then it is represented by comment node and we
585
+ // need to use it as an anchor. If it is projected then its direct parent node is the renderer.
586
+ if ( isIcuCase && parent . flags & TNodeFlags . isProjected ) {
587
+ return getNativeByTNode ( parent , currentView ) . parentNode as RElement ;
588
+ }
589
+
590
+ ngDevMode && assertNodeType ( renderParent , TNodeType . Element ) ;
591
+ if ( renderParent . flags & TNodeFlags . isComponent && ! isIcuCase ) {
584
592
const tData = currentView [ TVIEW ] . data ;
585
- const tNode = tData [ parent . index ] as TNode ;
593
+ const tNode = tData [ renderParent . index ] as TNode ;
586
594
const encapsulation = ( tData [ tNode . directiveStart ] as ComponentDef < any > ) . encapsulation ;
587
595
588
596
// We've got a parent which is an element in the current view. We just need to verify if the
@@ -597,7 +605,7 @@ function getRenderParent(tNode: TNode, currentView: LView): RElement|null {
597
605
}
598
606
}
599
607
600
- return getNativeByTNode ( parent , currentView ) as RElement ;
608
+ return getNativeByTNode ( renderParent , currentView ) as RElement ;
601
609
}
602
610
}
603
611
0 commit comments