- From: Nicolas Gilbert <notifications@github.com>
- Date: Sun, 26 Feb 2023 05:56:46 -0800
- To: WICG/webcomponents <webcomponents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <WICG/webcomponents/issues/969/1445368151@github.com>
Here's an idea that seems to work, although I'm not sure it can be implemented.
If scoped registries were to define a sub-class of the passed component, adding to it a reference to the registry, it would allow the HTMLElement constructor to identify the registry on which the component is registered.
```
let preSuperCalled = false;
let preSuperComponent;
let postSuperCalled = false;
let postSuperComponent;
const $registry = Symbol('[[Registry]]');
class CustomElementRegistry {
#registry = {}
constructor(name) {
this.registryName = name;
}
define(name, Component) {
if (customElements === this) {
this.#registry[name] = Component;
} else {
this.#registry[name] = class extends Component {
static [$registry] = registry;
}
}
}
get(name) {
return this.#registry[name];
}
}
const customElements = new CustomElementRegistry('global');
// HTMLElement has a default registry field
class HTMLElement {
static [$registry] = customElements;
constructor(name) {
console.log(`Component "${name}" on registry "${this.constructor[$registry].registryName}"`);
}
}
class ReentryByDirectCall extends HTMLElement {
constructor(name) {
if (!preSuperCalled) {
preSuperCalled = true;
preSuperComponent = new ReentryByDirectCall('pre-component');
}
super(name);
if (!postSuperCalled) {
postSuperCalled = true;
postSuperComponent = new ReentryByDirectCall('post-component');
}
}
}
customElements.define('test-element', ReentryByDirectCall);
let registry = new CustomElementRegistry('custom');
registry.define('shadow-test-element', ReentryByDirectCall);
new (registry.get('shadow-test-element'))('shadow-custom-component');
```
[Working codepen.](https://codepen.io/chalbert/pen/QWVGjOW?editors=0012)
This works for components created from constructor both pre and post super() call.
------
The downside would be that if the constructor is accessed from within a custom-scoped component, it will not be the original constructor but the subclassed one. Or maybe that could become a feature as it could be useful to know if a custom element is used on the global registry or a custom one.
Looking forward to using scoped registries!
--
Reply to this email directly or view it on GitHub:
https://github.com/WICG/webcomponents/issues/969#issuecomment-1445368151
You are receiving this because you are subscribed to this thread.
Message ID: <WICG/webcomponents/issues/969/1445368151@github.com>
Received on Sunday, 26 February 2023 13:57:00 UTC