AUR0764-0765
Error Message
AUR0764: Trying to retrieve a custom element controller from a node. But the provided node <<nodeName> /> does not appear to be part of an Aurelia app DOM tree, or it was added to the DOM in a way that Aurelia cannot properly resolve its position in the component tree.
AUR0765: Trying to retrieve a custom element controller from a node. But the provided node <<nodeName> /> does not appear to be part of an Aurelia app DOM tree, or it was added to the DOM in a way that Aurelia cannot properly resolve its position in the component tree.
Where <nodeName>
is the tag name of the DOM node provided.
Description
These errors occur when Aurelia tries to locate the nearest component controller associated with a given DOM node by traversing up the DOM tree (using the internal CustomElement.findController
method, which might be called by other APIs). The traversal failed to find any recognized Aurelia component boundary before reaching the top of the document or a shadow root boundary. This indicates the provided node is likely outside the part of the DOM managed by the Aurelia application instance.
Cause
External Node: The target node exists in the DOM but was created and appended outside the control of the Aurelia application (e.g., via direct
document.createElement
,innerHTML
manipulation, or by a non-Aurelia library). Aurelia doesn't automatically associate controllers with such nodes.Detached Node: The node might have been part of an Aurelia component initially but was removed from the Aurelia-managed DOM tree before the controller lookup was attempted.
Incorrect Application Root: The Aurelia application might not have been started correctly on a container element that encompasses the target node.
Shadow DOM Issues: If using Shadow DOM extensively, the traversal might stop at a shadow root boundary if the lookup wasn't initiated from within that shadow root's context correctly.
Timing/Lifecycle: Attempting the lookup before the node and its parent components have been fully processed and attached by Aurelia.
Solution
Ensure Node is Aurelia-Managed: Verify that the target node was rendered as part of an Aurelia component's template or dynamically composed using Aurelia APIs (like
au-compose
or view slot manipulation). Avoid manipulating the DOM managed by Aurelia using external methods if you need to interact with controllers later.Correct Starting Point: Ensure the code attempting to find the controller is executing within the context of the Aurelia application and that the target node is a descendant of the application's root element.
Use
CustomElement.for(node)
first: If you intend to get the controller for a specific custom element host node, useCustomElement.for(node)
(see AUR0762/AUR0763) first.findController
is more for finding the nearest owning controller from an arbitrary node within a component's view.Check Lifecycle: Ensure the lookup occurs after the relevant parts of the DOM have been attached and rendered by Aurelia (e.g., in
attached
lifecycle hooks, after awaiting relevant promises).
Example
<!-- Assume this is outside the Aurelia root element -->
<div id="external-div">External Content</div>
<!-- Assume this is the Aurelia root -->
<div id="aurelia-root">
<my-app></my-app>
</div>
import { CustomElement, IPlatform } from 'aurelia';
// Assume MyApp component exists and is the root of the Aurelia app within #aurelia-root
export class SomeService {
constructor(private platform: IPlatform) {}
findControllerForExternalNode() {
// This node is likely outside Aurelia's managed tree
const externalNode = this.platform.document.getElementById('external-div');
if (externalNode) {
this.platform.domReadQueue.queueTask(() => {
try {
// This will likely fail as the walk up from externalNode won't hit an Aurelia controller
const controller = CustomElement.findController(externalNode); // Throws AUR0764/AUR0765
console.log('Found controller:', controller);
} catch (e) {
console.error('Error finding controller for external node:', e);
}
});
}
}
// Correct usage: Finding controller from within a managed component
findControllerFromInside(someNodeInsideAureliaComponent: Node) {
this.platform.domReadQueue.queueTask(() => {
try {
// This should succeed if someNodeInsideAureliaComponent is part of a rendered component
const controller = CustomElement.findController(someNodeInsideAureliaComponent);
console.log('Found owning controller:', controller);
} catch (e) {
console.error('Error finding controller:', e);
}
});
}
}
Debugging Tips
Inspect the target node and its ancestors in the browser's element inspector. Verify it is indeed inside the DOM element where your Aurelia app was started (
Aurelia.app({ host: ..., component: ... })
).Check how the target node was added to the DOM. Was it via an Aurelia template, or some other mechanism?
If added dynamically, ensure it was done using Aurelia-aware mechanisms if controller association is needed.
Set breakpoints in
CustomElement.findController
(if possible in development builds) or log the node being passed to it to confirm it's the expected one.
Last updated
Was this helpful?