@@ -37,12 +37,20 @@ export function generateNativeScriptView<T>(
37
37
viewContainerRef ?: ViewContainerRef ;
38
38
injector : Injector ;
39
39
keepNativeViewAttached ?: boolean ;
40
+ /**
41
+ * reuse a detachedLoaderRef. This will override viewContainerRef
42
+ */
43
+ detachedLoaderRef ?: ComponentRef < DetachedLoader > ;
40
44
}
41
45
) {
46
+ let detachedLoaderRef : ComponentRef < DetachedLoader > = options . detachedLoaderRef ;
47
+ const reusingDetachedLoader = ! ! detachedLoaderRef ;
48
+ if ( reusingDetachedLoader ) {
49
+ options . viewContainerRef = detachedLoaderRef . instance . vc ;
50
+ }
42
51
const injector = options . viewContainerRef ?. injector || options . injector ;
43
52
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 ) ) {
46
54
detachedLoaderRef = generateDetachedLoader ( resolver , injector , options . viewContainerRef ) ;
47
55
}
48
56
let portal : ComponentPortal < T > | TemplatePortal < T > ;
@@ -54,9 +62,11 @@ export function generateNativeScriptView<T>(
54
62
const parentView = new ContentView ( ) ;
55
63
const portalOutlet = new NativeScriptDomPortalOutlet ( parentView , resolver , injector . get ( ApplicationRef ) , injector ) ;
56
64
const componentOrTemplateRef : ComponentRef < T > | EmbeddedViewRef < T > = portalOutlet . attach ( portal ) ;
57
- if ( detachedLoaderRef ) {
65
+ componentOrTemplateRef . onDestroy ( ( ) => {
66
+ portalOutlet . dispose ( ) ;
67
+ } ) ;
68
+ if ( detachedLoaderRef && ! reusingDetachedLoader ) {
58
69
componentOrTemplateRef . onDestroy ( ( ) => {
59
- portalOutlet . dispose ( ) ;
60
70
detachedLoaderRef . destroy ( ) ;
61
71
} ) ;
62
72
}
0 commit comments