(bug report only)
Environment
TabStrip Tab is never destroyed
Components/TabStrip/Tab.razor.cs registers each tab with initTabStripTab in OnAfterRenderAsync. Its Dispose() only releases the DotNetObjectReference; it never calls InvokeDisposeAsync(). The JS Tab.destroy() method is therefore never called, and TabStrip.destroy() does not destroy its child tabs. Every tab stays in window.TelerikBlazor._instances with its detached <li class="k-tabstrip-item">, which again keeps the disposed page reachable.
Object.entries(TelerikBlazor._instances) .filter(([k, i]) => i && i.element && !i.element.isConnected) .map(([k, i]) => k + ' / ' + i.constructor.name)
Sample project attached.
(optional)
One entry per TabStrip tab is returned, all pointing at detached elements. Each pageA -> pageB round trip adds more, and the detached DOM is never released.
An empty array is returned. PageA's components were disposed, so their JS instances should have been destroyed.
Workaround
After each navigation, we destroy and remove any registered instance whose element is no longer in the page:
const instances = window.TelerikBlazor && window.TelerikBlazor._instances; for (const key of Object.keys(instances || {})) { const i = instances[key]; if (i && i.element && !i.element.isConnected) { try { i.destroy && i.destroy(); } catch (e) { } delete instances[key]; } }
Suggested Fix