- From: Carlos Lopez <notifications@github.com>
- Date: Wed, 11 Jan 2023 07:33:25 -0800
- To: WICG/webcomponents <webcomponents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <WICG/webcomponents/issues/959/1378959609@github.com>
`host` in scope can be polyfilled like this: ````diff + <template id="hostScopeTemplate"> + <div> + <script>var host = null</script> + <button hidden onclick="host = this.getRootNode().host" /> + </div> + </template> <template id="myCustomElementTemplate"> <button onclick="host.handleClick()"><slot></slot></button> </template> <script type="module"> + let scopeTemplate; + function setHostInScope(shadowRoot) { + scopeTemplate = scopeTemplate ?? document.getElementById('hostScopeTemplate'); + shadowRoot.appendChild(scopeTemplate.content.cloneNode(true)); + shadowRoot.querySelector('button').click() + shadowRoot.querySelector('div').remove(); + } /* ... */ class myCustomElement extends HTMLElement { static { customElements.define('x-button', this); } constructor() { super(); const shadowRoot = this.attachShadow({ mode: "open" }); setHostInScope(shadowRoot); + const template = document.getElementById("myCustomElementTemplate"); shadowRoot.appendChild(template.content.cloneNode(true)); } handleClick() { window.alert('You clicked me!'); } } /* ... */ </script> <x-button>Click me</x-button> ```` Hacky, but it works. It's probably cleaner to have `myCustomElement` extend something other than `HTMLElement` for multiple components. There's no access to private fields though. The click workaround is because scripts can't know it's element/context. If it wasn't for that, we could eliminate the hidden click and it would be one liner that doesn't need to be removed. -- Reply to this email directly or view it on GitHub: https://github.com/WICG/webcomponents/issues/959#issuecomment-1378959609 You are receiving this because you are subscribed to this thread. Message ID: <WICG/webcomponents/issues/959/1378959609@github.com>
Received on Wednesday, 11 January 2023 15:33:38 UTC