Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.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,我正在创建一个web组件,希望显示选定的项目。 有一个父组件从api获取数据,并创建一个填充了该数据的组件。这是一个非常精简的版本,但你应该得到的问题 父组件看起来像 const myComponent = document.createElement('template'); class MyComponent extends HTMLElement { render(el) { if (this.selectedItems.length === 0) {

我正在创建一个web组件,希望显示选定的项目。 有一个父组件从api获取数据,并创建一个填充了该数据的组件。这是一个非常精简的版本,但你应该得到的问题

父组件看起来像

const myComponent = document.createElement('template');

class MyComponent extends HTMLElement {
    render(el) {
        if (this.selectedItems.length === 0) {
            selectedContent = `Nothing selected!`;
        } else {
            selectedContent = `<p>Selected:</p>`;
            selectedContent += `<ul>`;
            for (let item of this.selectedItems) {
                selectedContent += `<li>${item.name}</li>`;
            }
            selectedContent += `</ul>`;
        }

        el.shadowRoot.innerHTML = `
            <div>
                <child-component data="${el._data}"></child-component>
                ${selectedContent}
            </div>`;
    }

    constructor() {
        super();

        let self = this;

        self.myService= new MyService();
        self.myItemsList= [];
        self.selectedItems = [];
        self.attachShadow({mode: 'open'});

        self.fetchData(self);
        self.setupEventListeners(self);
    }

    async fetchData(self) {
        try {
            const response = await self.myService.getData();
            const items = response.data;
            items.forEach((item) => {
                self.myItemsList.push({item});
            });
            self.render(self);
        } catch (error) {
            console.log(error);
        }
    }

    setupEventListeners(self) {
        EventBus.addEventListener("my-custom-event", (event) => {
            const item = event.target;
            if (item.active === true) {
                    self.selectedItems = _.reject(self.selectedItems, (element) => {
                        return element.name === self.myItemsList[item.position].name;
                    });
                    self.myItemsList[item.position].checked = false;
            } else if (item.active === false) {
                    self.selectedItems.push(item);
                    self.myItemsList[item.position].checked = true;
            } 
            self.render(self);
        });
    }

    attributeChangedCallback(attrName, oldVal, newVal) {
        if (oldVal !== newVal) {
            this[`_${attrName}`] = newVal;
            this.render(this);
        }
    }

    connectedCallback() {
        this.render(this);
        this.appendChild(myComponent.content.cloneNode(true));
    }
}

window.customElements.define("bootstrap-card-parent", BootstrapCardParent);
const myComponent=document.createElement('template');
类MyComponent扩展了HtmleElement{
渲染(el){
if(this.selectedItems.length==0){
selectedContent=`未选择任何内容!`;
}否则{
selectedContent=`Selected:

`; 所选内容+=`
    `; for(让此项中的项选择EditEMS){ selectedContent+=`
  • ${item.name}
  • `; } 所选内容+=`
`; } el.shadowRoot.innerHTML=` ${selectedContent} `; } 构造函数(){ 超级(); 让自我=这个; self.myService=newmyservice(); self.myItemsList=[]; self.selectedItems=[]; attachShadow({mode:'open'}); self.fetchData(self); self.setupEventListeners(self); } 异步获取数据(自){ 试一试{ const response=wait self.myService.getData(); const items=response.data; items.forEach((项目)=>{ self.myItemsList.push({item}); }); self.render(self); }捕获(错误){ console.log(错误); } } setupEventListeners(自身){ EventBus.addEventListener(“我的自定义事件”,(事件)=>{ const item=event.target; 如果(item.active==真){ self.selectedItems=\uu0.reject(self.selectedItems,(元素)=>{ return element.name==self.myItemsList[item.position].name; }); self.myItemsList[item.position].checked=false; }else if(item.active==false){ self.selectedItems.push(项目); self.myItemsList[item.position].checked=true; } self.render(self); }); } attributeChangedCallback(属性名称、旧值、新值){ if(oldVal!==newVal){ 这个[`{attrName}`]=newVal; 这个,渲染(这个),; } } connectedCallback(){ 这个,渲染(这个),; this.appendChild(myComponent.content.cloneNode(true)); } } window.customElements.define(“引导卡父项”,引导卡父项);
子组件:

const myComponentChild = document.createElement('template');


class MyChildComponent extends HTMLElement {
    render(el) {
        el.shadowRoot.innerHTML = `
            <div>${el._data}</div>
            <input type="checkbox"
onchange="MyChildComponent.onAddToSelectedRequest(${el._data})">`;
    }

    static get observedAttributes() {
        return ['data'];
    }

    constructor() {
        super();
        this.attachShadow({mode: 'open'});
    }

    attributeChangedCallback(attrName, oldVal, newVal) {
        if (oldVal !== newVal) {
            this[`_${attrName}`] = newVal;
            this.render(this);
        }
    }

    connectedCallback() {
        this.render(this);
        this.appendChild(myComponentChild.content.cloneNode(true));
    }

    static onAddToSelectedRequest(someData) {
        EventBus.dispatch("my-custom-event", someData);
    }
}

window.customElements.define("my-child-component", MyChildComponent);
const myComponentChild=document.createElement('template');
类MyChildComponent扩展了HtmleElement{
渲染(el){
el.shadowRoot.innerHTML=`
${el.\u data}
`;
}
静态get ObservedAttribute(){
返回['data'];
}
构造函数(){
超级();
this.attachShadow({mode:'open'});
}
attributeChangedCallback(属性名称、旧值、新值){
if(oldVal!==newVal){
这个[`{attrName}`]=newVal;
这个,渲染(这个),;
}
}
connectedCallback(){
这个,渲染(这个),;
this.appendChild(myComponentChild.content.cloneNode(true));
}
静态onAddToSelectedRequest(某些数据){
调度(“我的自定义事件”,someData);
}
}
定义(“我的子组件”,MyChildComponent);

目前,我在EventListener中调用
self.render(self)
,以重新启动页面以查看我的数据。难道没有办法只重新播放所选项目数组的内容吗?

让您的子元素侦听事件。看我是否理解正确,您要执行以下操作:-获取项目列表-使用这些项目填充
-选择项目-使用所选项目填充
items@StefanN是的,就是这样@Danny'365CSI'Engelman我不明白这个问题如何帮助meI个人不认为您需要父组件。它只获取数据并将其传递给子组件。你也可以在应用程序中处理。然后,您可以创建一个更通用的组件(即列表组件),该组件处理显示数据,并添加一个布尔参数以将项目标记为选定项。