AUR0808
Error Message
AUR0808: Composition has already been deactivated.
Description
This error signals an internal state inconsistency within the <au-compose>
element, specifically during its detachment phase. It is thrown when the detaching
lifecycle hook of the <au-compose>
element attempts to initiate the deactivation process for the composed component, but the internal state indicates that a deactivation is already in progress or has already completed.
Cause
Similar to AUR0807, this error typically stems from internal state management issues rather than direct application code errors:
Internal Logic Error: A potential bug in how
<au-compose>
tracks the deactivation state, possibly related to its internalcomposition
promise.Lifecycle Overlap/Race Condition: Complex scenarios involving rapid attaching/detaching of the
<au-compose>
element itself, or perhaps unusual interactions with parent component lifecycles, could theoretically lead to overlapping calls or state mismatches during deactivation.External Interference: Although unlikely, external code directly manipulating the DOM or interfering with the standard Aurelia lifecycle might disrupt the expected deactivation sequence.
Solution
The approach to resolving this is similar to AUR0807:
Simplify Usage: Reduce complexity around the
<au-compose>
element. If it's conditionally rendered (if.bind
) or part of arepeat.for
, ensure the conditions or array changes leading to its detachment are clean and not occurring in rapid, potentially conflicting ways.Review Lifecycles (Host and Composed): Check the
detaching
hook of the component hosting<au-compose>
and thedeactivate
hook of the component being composed for any unusual synchronous or asynchronous behavior, or uncaught errors.Check Aurelia Version: Ensure you're using a recent and stable version of Aurelia.
Report the Issue: If simplification doesn't resolve the issue, gather details (code, steps to reproduce, Aurelia version, stack trace) and report it as a potential bug on the Aurelia GitHub repository after creating a minimal reproduction case.
Example
Triggering this reliably is difficult as it relates to internal state during detachment. A scenario might involve rapidly adding/removing the <au-compose>
element from the DOM.
<!-- Hypothetical scenario: Rapidly adding/removing au-compose -->
<template if.bind="showCompose">
<au-compose component.bind="someComponent"></au-compose>
</template>
<button click.trigger="toggleComposeQuickly()">Toggle</button>
// View Model
import { customElement } from 'aurelia';
import { SomeComponent } from './some-component';
@customElement({ /* ... */ })
export class MyApp {
showCompose = true;
someComponent = SomeComponent;
toggleComposeQuickly() {
// Rapid toggling might, in edge cases, interfere with
// the deactivation/detaching sequence.
this.showCompose = false;
setTimeout(() => { this.showCompose = true; }, 1); // Very short delay
setTimeout(() => { this.showCompose = false; }, 2);
}
}
(Note: This example is illustrative and might not trigger AUR0808 directly.)
Debugging Tips
Focus on the circumstances under which the
<au-compose>
element is being detached from the DOM (e.g.,if.bind
becoming false, removal from a repeated list, host component detachment).Add logging within the
detaching
hook of the host component and thedeactivate
hook of the composed component to understand the timing of events.Use browser developer tools to set breakpoints around the detachment phase of the
<au-compose>
element and inspect its internal state (like thecomposition
promise) if possible.Ensure no external scripts are removing the
<au-compose>
element from the DOM outside of Aurelia's control.
Last updated
Was this helpful?