- From: Dominic Cooney <dominicc@google.com>
- Date: Sun, 8 Dec 2013 08:31:20 +0900
- To: Maciej Stachowiak <mjs@apple.com>
- Cc: Elliott Sprehn <esprehn@chromium.org>, Ryosuke Niwa <rniwa@apple.com>, Webapps WG <public-webapps@w3.org>
- Message-ID: <CAHnmYQ_LqCHGSMHkU06jjX1NRhqrVW2DDQ1LoEi51qQ_9xMYQg@mail.gmail.com>
On Sat, Dec 7, 2013 at 3:44 PM, Maciej Stachowiak <mjs@apple.com> wrote:
>
> On Dec 6, 2013, at 7:41 PM, Elliott Sprehn <esprehn@chromium.org> wrote:
>
> >
> > On Thu, Dec 5, 2013 at 5:37 PM, Ryosuke Niwa <rniwa@apple.com> wrote:
> > Hi,
> >
> > Given that many important/natural use cases of custom elements involve
> shadow DOM,
> > can we add a flag to auto-create shadow DOM for custom elements?
> >
> > In particular, can we add "template" as the third argument to
> document.register so that
> > when a custom element is "instantiated", the specified template is
> automatically closed
> > and inserted into a shadow DOM of the custom element.
> >
> >
> > Can you explain the advantage of this? It saves one line of code:
> >
> >
> this.createShadowRoot().appendChild(document.importNode(template.contents));
> >
> > I don't see how pushing that one line down into the browser is helping
> anyone.
>
> It's not reasonable to require developers to write the above super tricky
> line of code. It involves at least four different concepts and is easy to
> get subtly wrong.
>
> For example, when I wrote my first component (after much reading of docs),
> I did this, which has at least two bugs[1]:
>
> shadow = this.createShadowRoot(this);
> shadow.appendChild(template.content.cloneNode(true));
>
> One of these bugs was copied from the Web Components Primer even.
>
I assume you are referring to the Explainer (if not, could you please
provide a link.) I am the editor of the Explainer. Please file a bug. In
some areas the Explainer is out of date.
I do not find either of those lines in the Explainer. But I could surmise
that you are referring to using cloneNode instead of importNode. No doubt
your bug will explain what you mean.
> In practice, the code delta is going to be more than one line, if you want
> to avoid polluting the global namespace.
>
> Here is my attempt at writing a trivial component with Custom Elements,
> Shadow DOM and Templates as they exist today. Note that this works in
> Chrome Canary as of a week ago with experimental web features turned on:
>
>
>
>
> I sincerely tried to minimize verbosity as much as possible, without
> introducing gratuitous namespace pollution or sacrificing clarity.
>
> Key lines:
>
> <!-- custom element definition -->
> <script>
> (function () {
> var prototype = Object.create(HTMLElement.prototype);
> var template = document.getElementById("rainbow-span-template");
>
> prototype.createdCallback = function() {
> var shadow = this.createShadowRoot(this);
> shadow.appendChild(template.content.cloneNode(true));
> }
>
> document.register("rainbow-span", {prototype: prototype});
> })();
> </script>
>
>
> Here is how it would look with the proposed 'template' parameter to
> document.register:
>
>
>
>
> This replaces 9 rather non-obvious non-blank lines of code with 1:
>
> <!-- custom element definition -->
> <script>
> document.register("rainbow-span", {template:
> document.getElementById("rainbow-span-template")});
> </script>
>
>
> Now, obviously things will get more complicated with components that do
> need to run code on creation beyond the basics. But I believe there will be
> substantial complexity savings. To make this work properly for more complex
> cases, the createCallback would need to take
>
>
> [1] (a)Forgot to var-declare shadow; (b) used cloneNode instead of
> importNode which would be wrong in case of a template from an import
> document.
>
>
>
> > Web components are part of the extensible web concept where we provide a
> minimal subset of features necessary for opinionated frameworks to build
> things on top. Supporting <template> in document.register is easily done in
> script, so I believe it's better left to developers as they're better at
> building frameworks than we are.
> >
> > In either case, that's something we can always add later so it shouldn't
> stand in the way of the current spec.
>
> The spec as it is makes it gratuitously complicated to create a basic
> component. As my examples above demonstrate, this would be a significant
> improvement in developer ergonomics and reduction of learning curve for a
> modest increase in implementation/spec complexity.
>
> I agree that it's important to provide the right building blocks for
> libraries. But that's not a reason to make things needlessly complicated if
> you try to code to the raw APIs. And the proposed template parameter is a
> good building block for libraries too!
>
>
> Regards,
> Maciej
>
>
>
>
>
>
>
--
<http://goto.google.com/dc-email-sla>
Received on Saturday, 7 December 2013 23:31:47 UTC