@@ -17,11 +17,11 @@ import {NodeInjectorFactory} from './interfaces/injector';
17
17
import { TElementNode , TNode , TNodeFlags , TNodeType , TProjectionNode , TViewNode , unusedValueExportToPlacateAjd as unused2 } from './interfaces/node' ;
18
18
import { unusedValueExportToPlacateAjd as unused3 } from './interfaces/projection' ;
19
19
import { ProceduralRenderer3 , RComment , RElement , RNode , RText , Renderer3 , isProceduralRenderer , unusedValueExportToPlacateAjd as unused4 } from './interfaces/renderer' ;
20
- import { CHILD_HEAD , CLEANUP , FLAGS , HEADER_OFFSET , HookData , LView , LViewFlags , NEXT , PARENT , QUERIES , RENDERER , TVIEW , T_HOST , unusedValueExportToPlacateAjd as unused5 } from './interfaces/view' ;
20
+ import { CHILD_HEAD , CLEANUP , FLAGS , HookData , LView , LViewFlags , NEXT , PARENT , QUERIES , RENDERER , TVIEW , T_HOST , unusedValueExportToPlacateAjd as unused5 } from './interfaces/view' ;
21
21
import { assertNodeType } from './node_assert' ;
22
22
import { renderStringify } from './util/misc_utils' ;
23
23
import { findComponentView , getLViewParent } from './util/view_traversal_utils' ;
24
- import { getNativeByTNode , isComponent , isLContainer , isLView , isRootView , unwrapRNode } from './util/view_utils' ;
24
+ import { getNativeByTNode , isComponent , isLContainer , isLView , isRootView , unwrapRNode , viewAttachedToContainer } from './util/view_utils' ;
25
25
26
26
const unusedValueToPlacateAjd = unused1 + unused2 + unused3 + unused4 + unused5 ;
27
27
@@ -350,7 +350,8 @@ export function detachView(lContainer: LContainer, removeIndex: number): LView {
350
350
views . splice ( removeIndex , 1 ) ;
351
351
addRemoveViewFromContainer ( viewToDetach , false ) ;
352
352
353
- if ( viewToDetach [ QUERIES ] ) {
353
+ if ( ( viewToDetach [ FLAGS ] & LViewFlags . Attached ) &&
354
+ ! ( viewToDetach [ FLAGS ] & LViewFlags . Destroyed ) && viewToDetach [ QUERIES ] ) {
354
355
viewToDetach [ QUERIES ] ! . removeView ( ) ;
355
356
}
356
357
viewToDetach [ PARENT ] = null ;
@@ -422,10 +423,8 @@ export function getParentState(lViewOrLContainer: LView | LContainer, rootView:
422
423
*
423
424
* @param view The LView to clean up
424
425
*/
425
- function cleanUpView ( viewOrContainer : LView | LContainer ) : void {
426
- if ( ( viewOrContainer as LView ) . length >= HEADER_OFFSET ) {
427
- const view = viewOrContainer as LView ;
428
-
426
+ function cleanUpView ( view : LView | LContainer ) : void {
427
+ if ( isLView ( view ) && ! ( view [ FLAGS ] & LViewFlags . Destroyed ) ) {
429
428
// Usually the Attached flag is removed when the view is detached from its parent, however
430
429
// if it's a root view, the flag won't be unset hence why we're also removing on destroy.
431
430
view [ FLAGS ] &= ~ LViewFlags . Attached ;
@@ -445,6 +444,10 @@ function cleanUpView(viewOrContainer: LView | LContainer): void {
445
444
ngDevMode && ngDevMode . rendererDestroy ++ ;
446
445
( view [ RENDERER ] as ProceduralRenderer3 ) . destroy ( ) ;
447
446
}
447
+ // For embedded views still attached to a container: remove query result from this view.
448
+ if ( viewAttachedToContainer ( view ) && view [ QUERIES ] ) {
449
+ view [ QUERIES ] ! . removeView ( ) ;
450
+ }
448
451
}
449
452
}
450
453
0 commit comments