diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json index 7c5c154a3a8..3ab139d8826 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json @@ -226,8 +226,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] } ] } \ No newline at end of file diff --git a/packages/compiler/src/template/pipeline/src/phases/defer_resolve_targets.ts b/packages/compiler/src/template/pipeline/src/phases/defer_resolve_targets.ts index 0d37f7404ed..37b7213e21a 100644 --- a/packages/compiler/src/template/pipeline/src/phases/defer_resolve_targets.ts +++ b/packages/compiler/src/template/pipeline/src/phases/defer_resolve_targets.ts @@ -7,7 +7,7 @@ */ import * as ir from '../../ir'; -import type {ViewCompilationUnit, ComponentCompilationJob} from '../compilation'; +import type {ComponentCompilationJob, ViewCompilationUnit} from '../compilation'; /** * Some `defer` conditions can reference other elements in the template, using their local reference @@ -58,6 +58,26 @@ export function resolveDeferTargetNames(job: ComponentCompilationJob): void { case ir.DeferTriggerKind.Interaction: case ir.DeferTriggerKind.Viewport: if (op.trigger.targetName === null) { + // A `null` target name indicates we should default to the first element in the + // placeholder block. + if (placeholderView === null) { + throw new Error('defer on trigger with no target name must have a placeholder block'); + } + const placeholder = job.views.get(placeholderView); + if (placeholder == undefined) { + throw new Error('AssertionError: could not find placeholder view for defer on trigger'); + } + for (const placeholderOp of placeholder.create) { + if (ir.hasConsumesSlotTrait(placeholderOp) && + (ir.isElementOrContainerOp(placeholderOp) || + placeholderOp.kind === ir.OpKind.Projection)) { + op.trigger.targetXref = placeholderOp.xref; + op.trigger.targetView = placeholderView; + op.trigger.targetSlotViewSteps = -1; + op.trigger.targetSlot = placeholderOp.handle; + return; + } + } return; } let view: ViewCompilationUnit|null =