Skip to content

Commit 1ee8fa3

Browse files
committed
fix(template-outlet): change strategy to destroy cache
1 parent 9154694 commit 1ee8fa3

File tree

3 files changed

+35
-7
lines changed

3 files changed

+35
-7
lines changed

projects/igniteui-angular/src/lib/directives/template-outlet/template_outlet.directive.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,15 @@ export class IgxTemplateOutletDirective implements OnChanges, OnDestroy {
7878
}
7979
}
8080

81+
/** Claims the created view so it won't be destroyed by this directive */
82+
public claimOwnership(type: string, id: string, viewRef: EmbeddedViewRef<unknown>) {
83+
const embViewCollection = this._embeddedViewsMap.get(type);
84+
const embView = embViewCollection?.get(id);
85+
if (embView && embView === viewRef) {
86+
embViewCollection.delete(id);
87+
}
88+
}
89+
8190
private _recreateView() {
8291
const prevIndex = this._viewRef ? this._viewContainerRef.indexOf(this._viewRef) : -1;
8392
// detach old and create new
@@ -88,7 +97,6 @@ export class IgxTemplateOutletDirective implements OnChanges, OnDestroy {
8897
if (this.igxTemplateOutlet) {
8998
this._viewRef = this._viewContainerRef.createEmbeddedView(
9099
this.igxTemplateOutlet, this.igxTemplateOutletContext);
91-
this.viewCreated.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
92100
const tmplId = this.igxTemplateOutletContext['templateID'];
93101
if (tmplId) {
94102
// if context contains a template id, check if we have a view for that template already stored in the cache
@@ -101,6 +109,7 @@ export class IgxTemplateOutletDirective implements OnChanges, OnDestroy {
101109
new Map([[this.igxTemplateOutletContext['templateID'].id, this._viewRef]]));
102110
}
103111
}
112+
this.viewCreated.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
104113
}
105114
}
106115

projects/igniteui-angular/src/lib/grids/grid/grid.component.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
Component, ChangeDetectionStrategy, Input, Output, EventEmitter, ContentChild, ViewChildren,
33
QueryList, ViewChild, TemplateRef, DoCheck, AfterContentInit, HostBinding,
4-
OnInit, AfterViewInit, ContentChildren, CUSTOM_ELEMENTS_SCHEMA, booleanAttribute
4+
OnInit, AfterViewInit, ContentChildren, CUSTOM_ELEMENTS_SCHEMA, booleanAttribute, OnDestroy,
55
} from '@angular/core';
66
import { NgIf, NgTemplateOutlet, NgClass, NgFor, NgStyle } from '@angular/common';
77

@@ -47,7 +47,7 @@ import { IgxCircularProgressBarComponent } from '../../progressbar/progressbar.c
4747
import { IgxOverlayOutletDirective, IgxToggleDirective } from '../../directives/toggle/toggle.directive';
4848
import { IgxSummaryRowComponent } from '../summaries/summary-row.component';
4949
import { IgxGridRowComponent } from './grid-row.component';
50-
import { IgxTemplateOutletDirective } from '../../directives/template-outlet/template_outlet.directive';
50+
import { IgxTemplateOutletDirective, IViewChangeEventArgs } from '../../directives/template-outlet/template_outlet.directive';
5151
import { IgxColumnMovingDropDirective } from '../moving/moving.drop.directive';
5252
import { IgxGridDragSelectDirective } from '../selection/drag-select.directive';
5353
import { IgxGridBodyDirective } from '../grid.common';
@@ -157,7 +157,7 @@ export interface IGroupingDoneEventArgs extends IBaseEventArgs {
157157
],
158158
schemas: [CUSTOM_ELEMENTS_SCHEMA]
159159
})
160-
export class IgxGridComponent extends IgxGridBaseDirective implements GridType, OnInit, DoCheck, AfterContentInit, AfterViewInit {
160+
export class IgxGridComponent extends IgxGridBaseDirective implements GridType, OnInit, DoCheck, AfterContentInit, AfterViewInit, OnDestroy {
161161
/**
162162
* Emitted when a new chunk of data is loaded from virtualization.
163163
*
@@ -443,7 +443,7 @@ export class IgxGridComponent extends IgxGridBaseDirective implements GridType,
443443
return this.gridAPI as IgxGridAPIService;
444444
}
445445

446-
private childDetailTemplates: Map<any, any> = new Map();
446+
private childDetailTemplates: Map<any, IViewChangeEventArgs> = new Map();
447447

448448
/**
449449
* @hidden @internal
@@ -953,16 +953,19 @@ export class IgxGridComponent extends IgxGridBaseDirective implements GridType,
953953
/**
954954
* @hidden @internal
955955
*/
956-
public viewCreatedHandler(args) {
956+
public viewCreatedHandler(args: IViewChangeEventArgs) {
957957
if (args.context.templateID.type === 'detailRow') {
958958
this.childDetailTemplates.set(args.context.$implicit, args);
959+
960+
// Claim ownership so life-cycle will be managed by the Grid
961+
args.owner.claimOwnership(args.context.templateID.type, args.context.templateID.id, args.view);
959962
}
960963
}
961964

962965
/**
963966
* @hidden @internal
964967
*/
965-
public viewMovedHandler(args) {
968+
public viewMovedHandler(args: IViewChangeEventArgs) {
966969
if (args.context.templateID.type === 'detailRow') {
967970
// view was moved, update owner in cache
968971
const key = args.context.$implicit;
@@ -1071,6 +1074,14 @@ export class IgxGridComponent extends IgxGridBaseDirective implements GridType,
10711074
super.ngDoCheck();
10721075
}
10731076

1077+
public override ngOnDestroy(): void {
1078+
super.ngOnDestroy();
1079+
for (const template of this.childDetailTemplates.values()) {
1080+
template.view.destroy();
1081+
}
1082+
this.childDetailTemplates.clear();
1083+
}
1084+
10741085
/**
10751086
* @hidden @internal
10761087
*/

projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,11 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti
879879
this._clearSeletionHighlights();
880880
}
881881
super.ngOnDestroy();
882+
883+
for (const template of this.childGridTemplates.values()) {
884+
template.view.destroy();
885+
}
886+
this.childGridTemplates.clear();
882887
}
883888

884889
/**
@@ -1057,6 +1062,9 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti
10571062
if (this.isChildGridRecord(args.context.$implicit)) {
10581063
const key = args.context.$implicit.rowID;
10591064
this.childGridTemplates.set(key, args);
1065+
1066+
// Claim ownership so life-cycle will be managed by the Grid
1067+
args.owner.claimOwnership(args.context.templateID.type, args.context.templateID.id, args.view);
10601068
}
10611069
}
10621070

0 commit comments

Comments
 (0)