- From: Justin Fagnani <notifications@github.com>
- Date: Wed, 08 May 2019 11:43:08 -0700
- To: w3c/webcomponents <webcomponents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/webcomponents/issues/812/490603707@github.com>
I don't have a lot to add to what @domenic said. The fact that we can write useful mixins in userland is great, and seems like the basis for a good standalone library. I would emphasize that trying to automatically handle `ElementInternals` in a mixin, while also keeping it available to the concrete class is a little tricky because of the lack of protected. I think you'll always need some shared state besides the instance reference itself (say a public field, a WeakMap, etc.). A mixin can override `attachInternals`, as ugly as that seems it probably composes better if multiple mixins try to get to internals. Something like this, though there may be a critical flaw in this idea: ```js const setFormValue = Symbol(FormAssociated.'setFormValue'); export const FormAssociated = (base) => class FormAssociated extends base { #internals; #internalsRetreived = false; constructor() { super(); this.#internals = this.attachInternals(); // allow another attachInternals() call, from the leaf class, or a mixin // that follows this pattern this.#internalsRetreived = false; } attachInternals() { if (this.#internalsRetreived) { throw new InvalidStateError('ElementInternals already requested'); } this.#internalsRetreived = true; return this.#internals; } [setFormValue](value, state) { this.#internals.setFormValue(value, state); } } FormAssociated.setFormValue = setFormValue; ``` ```js import {FormAssociated} from 'form-associated'; class MyControl = FormAssociated(HTMLElement) { #internals; constructor() { // maybe for AOM, pseudo-classes, etc. this.#internals = this.attachInternals(); } formResetCallback() { this.value = ''; this[FormAssociated.setFormValue](this.value); } } ``` -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/w3c/webcomponents/issues/812#issuecomment-490603707
Received on Wednesday, 8 May 2019 18:43:30 UTC