@@ -37,12 +37,20 @@ export function generateNativeScriptView<T>(
3737 viewContainerRef ?: ViewContainerRef ;
3838 injector : Injector ;
3939 keepNativeViewAttached ?: boolean ;
40+ /**
41+ * reuse a detachedLoaderRef. This will override viewContainerRef
42+ */
43+ detachedLoaderRef ?: ComponentRef < DetachedLoader > ;
4044 }
4145) {
46+ let detachedLoaderRef : ComponentRef < DetachedLoader > = options . detachedLoaderRef ;
47+ const reusingDetachedLoader = ! ! detachedLoaderRef ;
48+ if ( reusingDetachedLoader ) {
49+ options . viewContainerRef = detachedLoaderRef . instance . vc ;
50+ }
4251 const injector = options . viewContainerRef ?. injector || options . injector ;
4352 const resolver = options . resolver || injector . get ( ComponentFactoryResolver ) ;
44- let detachedLoaderRef : ComponentRef < DetachedLoader > ;
45- if ( options . viewContainerRef || typeOrTemplate instanceof TemplateRef ) {
53+ if ( ! detachedLoaderRef && ( options . viewContainerRef || typeOrTemplate instanceof TemplateRef ) ) {
4654 detachedLoaderRef = generateDetachedLoader ( resolver , injector , options . viewContainerRef ) ;
4755 }
4856 let portal : ComponentPortal < T > | TemplatePortal < T > ;
@@ -54,9 +62,11 @@ export function generateNativeScriptView<T>(
5462 const parentView = new ContentView ( ) ;
5563 const portalOutlet = new NativeScriptDomPortalOutlet ( parentView , resolver , injector . get ( ApplicationRef ) , injector ) ;
5664 const componentOrTemplateRef : ComponentRef < T > | EmbeddedViewRef < T > = portalOutlet . attach ( portal ) ;
57- if ( detachedLoaderRef ) {
65+ componentOrTemplateRef . onDestroy ( ( ) => {
66+ portalOutlet . dispose ( ) ;
67+ } ) ;
68+ if ( detachedLoaderRef && ! reusingDetachedLoader ) {
5869 componentOrTemplateRef . onDestroy ( ( ) => {
59- portalOutlet . dispose ( ) ;
6070 detachedLoaderRef . destroy ( ) ;
6171 } ) ;
6272 }
0 commit comments