【问题标题】:custom components - how to clone html template defined as js string literal?自定义组件 - 如何克隆定义为 js 字符串文字的 html 模板?
【发布时间】:2018-02-15 14:43:23
【问题描述】:

我试图了解原版 Web 组件的不同部分如何协同工作。我已经定义了一个简单的自定义组件,并试图包含一个模板。我这样做是因为许多浏览器供应商不支持 html 导入并转而使用 es6 模块。这是我的网络组件:

var tmpl = `<template>
<h1>header</h1>
<p>copy</p>
</template>`;

class MyComponent extends HTMLElement {
    constructor() {
        super();
    }
    connectedCallback() {
        let z = tmpl.cloneNode(true);
        this.appendChild(z);
    }
}

customElements.define('my-comopnent', MyComponent);

我得到的错误是 Uncaught Type Error: cloneNode is not a function 我想这与我将模板定义为字符串的方式有关。

我的问题是:如何在模板被定义为 javascript 字符串文字的自定义组件中删除我的模板?我可以在没有其他依赖项或 npm 库的情况下这样做吗?

【问题讨论】:

    标签: javascript templates web-component custom-component


    【解决方案1】:

    查看https://developer.mozilla.org/en-US/docs/Web/API/Node/cloneNode cloneNodeNode 接口上的一个方法。

    在您的代码中,tmpl 不是Node,而是string

    你需要在你的代码顶部做这样的事情:

    let tmpl = document.createElement('template');
    tmpl.innerHTML = `
    <h1>header</h1>
    <p>copy</p>
    `;
    

    【讨论】:

    • 谢谢@sideshowbarker,编辑没问题 - (1) template 不在innerHTML..? (2) 我打算将字符串更新为字符串文字,但你打败了我
    • 是的,就 innerHTML 应该是什么而言,我认为 OP 不希望有 &lt;template&gt;&lt;template&gt;…&lt;/template&gt;&lt;/template&gt;
    • 无论如何,我认为更典型的做法是在MyComponent 构造函数中使用attachShadow,如下所示:'const shadowRoot = this.attachShadow({mode: 'open'} ); shadowRoot.innerHTML = `

      header

      copy

      `'。 (尽管您需要想象该标记中的换行符,因为 Stack Overflow 会在 cmets 中吃掉它们。)
    • 感谢@sideshowbarker。我知道在影子根中设置 innerhtml 的典型方法。我想弄清楚的是如何使用未附加到父文档的模板,以便我可以保持组件自包含。也许我应该提出一个新问题...
    • @tim 是的,我认为一个具有更具体描述的新问题会很好。但就您在这里实际提出的问题而言,我认为@itodd 的回答是一个很好的回答,它将帮助 Stack Overflow 的其他人,他们将来会在这里遇到您的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2020-11-14
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多