Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何动态设置Web组件的属性_Javascript_Html_Web Component - Fatal编程技术网

Javascript 如何动态设置Web组件的属性

Javascript 如何动态设置Web组件的属性,javascript,html,web-component,Javascript,Html,Web Component,我一直在尝试为我设计的名为ws-dialog的自定义web组件设置属性。它总是在代码中添加一个未定义的属性: <ws-dialog class="global" undefined="add-page-content"></ws-dialog> } 下面是我的自定义组件的代码: "use strict"; class Dialog extends HTMLElement { connectedCallback() { //Styles f

我一直在尝试为我设计的名为ws-dialog的自定义web组件设置属性。它总是在代码中添加一个未定义的属性:

<ws-dialog class="global" undefined="add-page-content"></ws-dialog>
}

下面是我的自定义组件的代码:

"use strict";


class Dialog extends HTMLElement {


    connectedCallback() {
        //Styles for this custom component are declared in a separate CSS module
    }


    updateContent(id) {
        let content = document.querySelector(`template#${id}`).content;

        if (content)
            this.append(content);
    }


    attributeChangedCallback(name, oldValue, newValue) {
        this.TEMPLATE = "template";

        switch (name) {
            case this.TEMPLATE:
                this.updateContent(newValue);
                break;
        }
    }


    static get observedAttributes() {
        return [this.TEMPLATE];
    }


    static getName() {
        return "ws-dialog";
    }


    get template() {
        return this.getAttribute(this.TEMPLATE);
    }


    set template(template) {
        this.setAttribute(this.TEMPLATE, template);
    }

}



customElements.define(Dialog.getName(), Dialog);

这里有一个操场,可以帮助您了解什么时候触发了什么方法

注意调用ObservedAttribute的时间和次数。 这意味着您的this.TEMPLATE未定义,因此成为数组中未定义的字符串

常量日志=…参数=>{ 让div=document.body.appendChilddocument.createElement'div'; div.style=`背景:${args.shift};颜色:白色;字体:13px Arial`; div.appendargs.join; } 自定义元素。定义“我的元素”,类扩展HtmleElement{ 日志{ logthis.getAttributecolor、this.outerHTML.split>[0]、“>”、…参数; } 静态获取观测属性{ 记录'red','my element observedAttributes';//此处没有'this'/元素! 返回[颜色]; } 构造函数{super.logconstructor} connectedCallback{ this.logconnectedCallback,this.innerHTML | |无innerHTML;//FireFox差异! setTimeout=>this.log`delayed connectedCallback${this.innerHTML}`,0; } attributeChangedCallbackname、oldValue、newValue{//4th W3C参数=浏览器中未实现命名空间 this.logattributeChangedCallback,name,oldValue | | null,newValue; } disconnectedCallback{this.logdisconnectedCallback} } document.body.onload==>{ 记录‘洋红’、‘加载事件’; A.setAttributecolor,暗绿色; B.innerHTML=查理取代了布拉沃; B.移除; } 阿尔法
Bravoadd console.logobserved、this.TEMPLATE语句到observed属性和所有其他方法,以便您了解它们何时运行,并记录this.TEMPLATE在该阶段的内容。这个diaram也有帮助:我尝试了日志记录方法,发现在设置属性时首先调用ObservedAttribute。如果我把this.TEMPLATE=TEMPLATE;,该属性设置为“模板”。但是一旦调用setter方法,它就会再次变得未定义。这与ObservedAttribute是静态的这一事实有关吗?编辑您的问题并点击Ctrl-M或按钮插入代码段,粘贴新代码,以便我们可以在StackOverflow上执行它,并查看发生了什么。谢谢,我在前面已经让它工作并运行了。主要的问题是,当加载所有内容时,会发生来自HTML文档的调用。调用setter方法后,模板“is”的值再次未定义。我试着用其他代码(而不是web组件)测试它,我发现不能在静态定义中真正定义属性。这个概念与Java非常相似,Java只允许在构造函数和对象实例中声明。不管怎样,我通过使用字符串文本(如模板)来实现它。
"use strict";


class Dialog extends HTMLElement {


    connectedCallback() {
        //Styles for this custom component are declared in a separate CSS module
    }


    updateContent(id) {
        let content = document.querySelector(`template#${id}`).content;

        if (content)
            this.append(content);
    }


    attributeChangedCallback(name, oldValue, newValue) {
        this.TEMPLATE = "template";

        switch (name) {
            case this.TEMPLATE:
                this.updateContent(newValue);
                break;
        }
    }


    static get observedAttributes() {
        return [this.TEMPLATE];
    }


    static getName() {
        return "ws-dialog";
    }


    get template() {
        return this.getAttribute(this.TEMPLATE);
    }


    set template(template) {
        this.setAttribute(this.TEMPLATE, template);
    }

}



customElements.define(Dialog.getName(), Dialog);