Skip to content

SPFx 1.24.0-rc.0: on list views the application customizer placeholders are sometimes never defined, and changedEvent never fires #11070

Open

Description

Target SharePoint environment

SharePoint Online

What SharePoint development model, framework, SDK or API is this about?

SharePoint Framework (SPFx) 1.24.0-rc.0, Application Customizer

Developer environment

macOS, Playwright 1.63 with Chromium and with Microsoft Edge 141. It is also seen in CI on Ubuntu.

What browser(s) / client(s) have you tested

Chromium, and Microsoft Edge 141.0.3537.57.

Additional environment details

Describe the bug / error

On some loads of a modern list view, our application customizer never gets its Bottom placeholder:

  • The log line never comes. The page never logs Defined clientSidePlaceholders: DialogContainer,Top,TopContent,Bottom. On the loads where the customizer renders, that line comes shortly before or after our bundle arrives.
  • The customizer is never told.
    • this.context.placeholderProvider.changedEvent never fires.
    • tryCreateContent(PlaceholderName.Bottom) returns undefined at the end of onInit and on navigatedEvent.
  • The element is there, empty. [data-sp-placeholder="Bottom"] is in the DOM, our bundle is loaded, and nothing is logged as an error.

How often:

The customizer, in short:

public async onInit(): Promise<void> {
  await super.onInit()
  // ... asynchronous set-up: data for the footer ...
  this.context.application.navigatedEvent.add(this, this._handleNavigatedEvent)
  this.context.placeholderProvider.changedEvent.add(this, this._render)
  this._render()
}

private async _handleNavigatedEvent(): Promise<void> {
  // ... refreshes one permission check ...
  this._render()
}

private _render(): void {
  if (!this._bottomPlaceholder) {
    this._bottomPlaceholder = this.context.placeholderProvider.tryCreateContent(
      PlaceholderName.Bottom,
      { onDispose: () => this._onDispose() }
    )
  }
  if (!this._bottomPlaceholder) return
  // renders the footer into this._bottomPlaceholder.domElement with createRoot
}

Steps to reproduce

  1. Deploy an application customizer that renders into PlaceholderName.Bottom and subscribes to placeholderProvider.changedEvent, as above.

  2. Open a modern list view, such as a custom list's AllItems.aspx, about 20 times, each in a new tab of one signed-in browser.

  3. On some loads:

    • the console lacks Defined clientSidePlaceholders: …;
    • changedEvent never fires;
    • the customizer renders nothing.

    With a cold cache in a fresh profile, it happens on most loads where the list view host runs twice (SPFx 1.24 RC: on modern list pages an extension's hooks sometimes run against the list view host's React ("Cannot read properties of null (reading 'useContext')") #11068).

Expected behavior

The Bottom placeholder is defined on every load of a list view, or changedEvent fires once it is, so the customizer can render into it.

Activity

  1. m365-agent-toolkit-assistant commented on Oct 21, 2026

    @m365-agent-toolkit-assistant

    👋 Hi Remi Blom-Ohlsen (@Remi749),

    Thank you for reporting this issue. Here is an AI-generated initial response:

    Classification: Bug — the reported intermittent failure on modern list views appears inconsistent with the documented Application Customizer placeholder pattern; the cause is unconfirmed.

    • The reporter sees the bundle and Bottom DOM element load, but tryCreateContent returns undefined and changedEvent never fires. A DOM element alone does not establish that an SPFx placeholder is available.
    • The code retries when placeholders change, as Microsoft’s example recommends. Registering the handler after asynchronous setup could miss an early event, but does not explain the reported loads where placeholders are never defined.
    • #11068 concerns a related list-view loading symptom, not a confirmed duplicate or cause.

    Upgrade check: The 1.24 preview notes list 1.24.0-rc.0 and no fix for this symptom.

    What to do now:

    1. Register changedEvent before asynchronous setup; keep the immediate retry.
    2. Compare failing and passing loads with a minimal customizer; provide sanitized console/network traces and framework script URLs for triage. Avoid rendering directly into SharePoint’s DOM element as a workaround.

    Useful links:


    Note: AI-generated guidance may be incomplete or incorrect. Please verify suggestions before applying them.

  2. Ashlesha-MSFT commented on Oct 22, 2026

    @Ashlesha-MSFT
    Contributor

    Hi Remi Blom-Ohlsen (@Remi749),

    We tested a minimal Application Customizer targeting SPFx 1.24.0-rc.0 on a modern custom list view in SharePoint Online using Microsoft Edge.

    The sample subscribes to placeholderProvider.changedEvent and application.navigatedEvent, attempts to acquire PlaceholderName.Bottom immediately during initialization, and retries on those events. It intentionally excludes React rendering and asynchronous data/permission setup to isolate placeholder availability.

    Results: Across 20+ new-tab loads in the same signed-in browser profile, the footer appeared on every load. The captured logs showed Bottom in placeholderNames, acquiredBottom: true, and a changedEvent notification.

    We have therefore not reproduced the reported issue in this test configuration. This does not rule out the intermittent behavior you observed, particularly given the differences from your customizer’s initialization and rendering sequence. Document-library and fresh-profile/cold-cache scenarios remain unverified.

    To help compare passing and failing loads, please share:

    • Sanitized console logs showing initialization, placeholderNames, acquisition results, and event notifications.
    • The affected tenant’s release preference (Standard or Targeted Release).
    • Whether the issue also occurs with a minimal customizer without React or asynchronous setup.

    Please remove credentials, tokens, and sensitive tenant or business information from any shared diagnostics.

  3. added
    Needs: Author FeedbackAwaiting response from the original poster of the issue. Marked as stale if no activity for 7 days.
    on Oct 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions