Skip to content

bug: popover height calculated incorrectly with popoverController + component #30320

Closed

Description

@willyboy

Prerequisites

Ionic Framework Version

v8.x

Current Behavior

When creating a popover with the popoverController and an Angular component, the height of the popover is calculated before Angular's change detection cycle is run. This means that if you are passing content into the popover, the height will be calculated incorrectly and the popover will be positioned wrong.

This mainly shows up when putting the popover in a footer as the offset is calculated using the content height.

Expected Behavior

Ionic shouldn't calculate the content height of the popover before a change detection cycle has run so that any height changes caused by component props will be reflected.

Steps to Reproduce

const popover = await this.popoverController.create({
      component: PopoverContentComponent,
      componentProps: { message: "some multiline content" },
      event: { target: element } as unknown as Event, // an element in a footer
    });
import { Component, Input } from '@angular/core';
import { CommonModule } from '@angular/common';

@Component({
  selector: 'popover-content',
  standalone: true,
  imports: [CommonModule],
  templateUrl: './popover-content.component.html',
  styleUrl: './popover-content.component.scss',
})
export class PopoverContentComponent {
  @Input() message = '';
}
<div class="popover-content">
    <p>{{ message }}</p>
</div>

Code Reproduction URL

https://github.com

Ionic Info

Ionic:

Ionic CLI : 7.2.0 (\AppData\Roaming\nvm\v18.20.3\node_modules@ionic\cli)
Ionic Framework : @ionic/angular 8.2.7 (\node_modules@ionic\angular)
@angular-devkit/build-angular : 18.2.12 (\node_modules@angular-devkit\build-angular)
@angular-devkit/schematics : 18.2.12 (\node_modules@angular-devkit\schematics)
@angular/cli : 18.2.12 (\node_modules@angular\cli)
@ionic/angular-toolkit : not installed

Capacitor:

Capacitor CLI : not installed
@capacitor/android : 6.1.0 (\node_modules@capacitor\android)
@capacitor/core : 6.1.0 (\node_modules@capacitor\core)
@capacitor/ios : 6.1.0 (\node_modules@capacitor\ios)

Utility:

cordova-res : not installed globally
native-run : not installed globally

System:

NodeJS : v18.20.3 (C:\Program Files\nodejs\node.exe)
npm : 10.7.0
OS : Windows 10

Additional Information

No response

Activity

  1. willyboy commented on Mar 30, 2025

    @willyboy
    Author

    Note, by placing the content in popover-component.html inside of an ion-content, the issue is resolved.

  2. thetaPC commented on Oct 14, 2026

    @thetaPC
    Contributor

    Thanks for the report, and sorry for the delay.

    Verified that this is fixed on 9.0.7. When a component opened with PopoverController renders text from componentProps, Angular used to fill in those bindings one tick after the component was attached. With the IonicModule (lazy loaded) imports, the popover measured its content before that tick, so it positioned itself for a nearly empty box and the real content ran past the bottom of the screen. Angular now runs change detection on the component as soon as it is attached, so the popover measures the rendered content.

    This was fixed in #31235, which shipped in 8.8.12. To pick up the fix, update to @ionic/angular 8.8.12 or later, or to 9.x. No code changes are needed.

    Wrapping the content in ion-content, as suggested in the earlier comment, only works on some 8.x releases. On later 8.x releases before 8.8.12 the popover is still mispositioned with it, so updating is the reliable fix.

    Closing this as completed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions