diff --git a/goldens/public-api/core/index.api.md b/goldens/public-api/core/index.api.md index 4f73671bba0..f1227f3bb48 100644 --- a/goldens/public-api/core/index.api.md +++ b/goldens/public-api/core/index.api.md @@ -1776,9 +1776,9 @@ export interface StreamingResourceOptions extends BaseResourceOptions { - abstract createEmbeddedView(context: C, injector?: Injector): EmbeddedViewRef; - abstract readonly elementRef: ElementRef; +export class TemplateRef { + createEmbeddedView(context: C, injector?: Injector): EmbeddedViewRef; + readonly elementRef: ElementRef; } // @public diff --git a/packages/core/src/linker/template_ref.ts b/packages/core/src/linker/template_ref.ts index d67c2d121c1..b09e6baedf3 100644 --- a/packages/core/src/linker/template_ref.ts +++ b/packages/core/src/linker/template_ref.ts @@ -12,7 +12,7 @@ import {TContainerNode, TNode, TNodeType} from '../render3/interfaces/node'; import {LView} from '../render3/interfaces/view'; import {getCurrentTNode, getLView} from '../render3/state'; import {createAndRenderEmbeddedLView} from '../render3/view_manipulation'; -import {ViewRef as R3_ViewRef} from '../render3/view_ref'; +import {ViewRef} from '../render3/view_ref'; import {assertDefined} from '../util/assert'; import {createElementRef, ElementRef} from './element_ref'; @@ -35,7 +35,7 @@ import {EmbeddedViewRef} from './view_ref'; * * @publicApi */ -export abstract class TemplateRef { +export class TemplateRef { /** * The anchor element in the parent view for this embedded view. * @@ -47,8 +47,32 @@ export abstract class TemplateRef { * data-binding and injection context from the original location. * */ - // TODO(i): rename to anchor or location - abstract readonly elementRef: ElementRef; + readonly elementRef: ElementRef; + + /** + * @internal + * @nocollapse + */ + static __NG_ELEMENT_ID__: () => TemplateRef | null = injectTemplateRef; + + /** @internal */ + constructor( + private _declarationLView: LView, + private _declarationTContainer: TContainerNode, + elementRef: ElementRef, + ) { + this.elementRef = elementRef; + } + + /** + * Returns an `ssrId` associated with a TView, which was used to + * create this instance of the `TemplateRef`. + * + * @internal + */ + get ssrId(): string | null { + return this._declarationTContainer.tView?.ssrId || null; + } /** * Instantiates an unattached embedded view based on this template. @@ -57,7 +81,9 @@ export abstract class TemplateRef { * @param injector Injector to be used within the embedded view. * @returns The new embedded view object. */ - abstract createEmbeddedView(context: C, injector?: Injector): EmbeddedViewRef; + createEmbeddedView(context: C, injector?: Injector): EmbeddedViewRef { + return this.createEmbeddedViewImpl(context, injector); + } /** * Implementation of the `createEmbeddedView` function. @@ -68,71 +94,20 @@ export abstract class TemplateRef { * * @internal */ - abstract createEmbeddedViewImpl( + createEmbeddedViewImpl( context: C, injector?: Injector, dehydratedView?: DehydratedContainerView | null, - ): EmbeddedViewRef; - - /** - * Returns an `ssrId` associated with a TView, which was used to - * create this instance of the `TemplateRef`. - * - * @internal - */ - abstract get ssrId(): string | null; - - /** - * @internal - * @nocollapse - */ - static __NG_ELEMENT_ID__: () => TemplateRef | null = injectTemplateRef; -} - -const ViewEngineTemplateRef = TemplateRef; - -// TODO(alxhub): combine interface and implementation. Currently this is challenging since something -// in g3 depends on them being separate. -const R3TemplateRef = class TemplateRef extends ViewEngineTemplateRef { - constructor( - private _declarationLView: LView, - private _declarationTContainer: TContainerNode, - public override elementRef: ElementRef, - ) { - super(); - } - - /** - * Returns an `ssrId` associated with a TView, which was used to - * create this instance of the `TemplateRef`. - * - * @internal - */ - override get ssrId(): string | null { - return this._declarationTContainer.tView?.ssrId || null; - } - - override createEmbeddedView(context: T, injector?: Injector): EmbeddedViewRef { - return this.createEmbeddedViewImpl(context, injector); - } - - /** - * @internal - */ - override createEmbeddedViewImpl( - context: T, - injector?: Injector, - dehydratedView?: DehydratedContainerView, - ): EmbeddedViewRef { + ): EmbeddedViewRef { const embeddedLView = createAndRenderEmbeddedLView( this._declarationLView, this._declarationTContainer, context, {embeddedViewInjector: injector, dehydratedView}, ); - return new R3_ViewRef(embeddedLView); + return new ViewRef(embeddedLView); } -}; +} /** * Creates a TemplateRef given a node. @@ -153,7 +128,7 @@ export function injectTemplateRef(): TemplateRef | null { export function createTemplateRef(hostTNode: TNode, hostLView: LView): TemplateRef | null { if (hostTNode.type & TNodeType.Container) { ngDevMode && assertDefined(hostTNode.tView, 'TView must be allocated'); - return new R3TemplateRef( + return new TemplateRef( hostLView, hostTNode as TContainerNode, createElementRef(hostTNode, hostLView), diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 6cd3a1d9b47..e8b297bce80 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -152,7 +152,6 @@ "PlatformRef", "PristineChangeEvent", "R3Injector", - "R3TemplateRef", "R3ViewContainerRef", "REACTIVE_LVIEW_CONSUMER_NODE", "REACTIVE_NODE", @@ -202,7 +201,6 @@ "ValueChangeEvent", "ViewContainerRef", "ViewEncapsulation", - "ViewEngineTemplateRef", "ViewRef", "ZONELESS_ENABLED", "ZONELESS_SCHEDULER_DISABLED", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 56f5b413a3e..dceed6fe9e6 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -149,7 +149,6 @@ "PlatformRef", "PristineChangeEvent", "R3Injector", - "R3TemplateRef", "R3ViewContainerRef", "REACTIVE_LVIEW_CONSUMER_NODE", "REACTIVE_NODE", @@ -199,7 +198,6 @@ "ValueChangeEvent", "ViewContainerRef", "ViewEncapsulation", - "ViewEngineTemplateRef", "ViewRef", "ZONELESS_ENABLED", "ZONELESS_SCHEDULER_DISABLED", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index f411d5f7d45..a63233ef643 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -171,7 +171,6 @@ "QUERY_PARAM_VALUE_RE", "QueryList", "R3Injector", - "R3TemplateRef", "R3ViewContainerRef", "REACTIVE_LVIEW_CONSUMER_NODE", "REACTIVE_NODE", @@ -248,7 +247,6 @@ "VE_ViewContainerRef", "ViewContainerRef", "ViewEncapsulation", - "ViewEngineTemplateRef", "ViewRef", "XSS_SECURITY_URL", "ZONELESS_ENABLED",