LitElement:如何在 vaadin 覆盖层中填充插槽
LitElement: How to populate a slot inside a vaadin overlay
我正在按照 this tutorial 创建我的组件。
在我的用例中,我需要将 Java 元素添加到 vaadin-overlay 内的插槽中。
<vaadin-overlay id="myOverlay">
<slot name="myslot"></slot>
</vaadin-overlay>
我猜是有某种计时问题,因为当我尝试将组件添加到该插槽时它没有显示。
Component component = ...
component.getElement().setAttribute("slot", "myslot");
add(dropdownEndSlot);
或者在叠加层内不可能吗?
2021 年 8 月 31 日更新:
the sampler中现在有代码示例供您测试和查看
2021 年 9 月 9 日更新:
我现在已经将整个组件完全重写为 litelement 并更新了 the sampler。据我所知,它正在运行,但是......还是有点慢。
Vaadin 覆盖一旦打开,就会将内容传送到 'real' 覆盖元素(显示的那个)——在任何 shadowRoot 之外创建。
这似乎是一个常见的问题,事实证明无法在叠加层内使用插槽(https://github.com/vaadin/vaadin-dialog/issues/11
).
至于“dropdownEndSlot”,例如对于 vcf-autosuggest 组件,它已被克服,如下所示:
<div id="dropdownEndSlot" part="dropdown-end-slot"></div>
然后在后台填写
@Id(value = "dropdownEndSlot")
private Element dropdownEndSlot;
public void clearDropdownEndSlot() {
dropdownEndSlot.removeAllChildren();
dropdownEndSlot.getStyle().set("display", "none");
}
public void setComponentToDropdownEndSlot(Component component) {
clearDropdownEndSlot();
dropdownEndSlot.getStyle().set("display", "block");
dropdownEndSlot.appendChild(component.getElement());
}
虽然这不是一个完美的解决方案,但像这样的东西可能会做到:
@Route("")
public class TestView extends VerticalLayout {
public TestView() {
CustomComponent cc = new CustomComponent();
Div testElement = new Div(new Span("IT WORKED !!!!"));
testElement.setId("IT-WORKED");
cc.addSlot001Content(testElement);
cc.openOverlay();
add(cc);
}
}
@Tag("custom-component")
@JsModule("./custom-component.ts")
public class CustomComponent extends LitTemplate {
@Id(value = "overlay")
private Element overlay;
@Id(value = "slot001")
private Element slot;
public void openOverlay() {
overlay.setAttribute("opened", "true");
}
public void addSlot001Content(Component component) {
slot.appendChild(component.getElement());
}
}
import { LitElement, html, customElement } from 'lit-element';
@customElement('custom-component')
export class CustomComponent extends LitElement {
render() {
return html`
<vaadin-overlay id="overlay">
<div id="slot001"></div>
</vaadin-overlay>`;
}
}
我正在按照 this tutorial 创建我的组件。 在我的用例中,我需要将 Java 元素添加到 vaadin-overlay 内的插槽中。
<vaadin-overlay id="myOverlay">
<slot name="myslot"></slot>
</vaadin-overlay>
我猜是有某种计时问题,因为当我尝试将组件添加到该插槽时它没有显示。
Component component = ...
component.getElement().setAttribute("slot", "myslot");
add(dropdownEndSlot);
或者在叠加层内不可能吗?
2021 年 8 月 31 日更新: the sampler中现在有代码示例供您测试和查看
2021 年 9 月 9 日更新: 我现在已经将整个组件完全重写为 litelement 并更新了 the sampler。据我所知,它正在运行,但是......还是有点慢。
Vaadin 覆盖一旦打开,就会将内容传送到 'real' 覆盖元素(显示的那个)——在任何 shadowRoot 之外创建。 这似乎是一个常见的问题,事实证明无法在叠加层内使用插槽(https://github.com/vaadin/vaadin-dialog/issues/11 ).
至于“dropdownEndSlot”,例如对于 vcf-autosuggest 组件,它已被克服,如下所示:
<div id="dropdownEndSlot" part="dropdown-end-slot"></div>
然后在后台填写
@Id(value = "dropdownEndSlot")
private Element dropdownEndSlot;
public void clearDropdownEndSlot() {
dropdownEndSlot.removeAllChildren();
dropdownEndSlot.getStyle().set("display", "none");
}
public void setComponentToDropdownEndSlot(Component component) {
clearDropdownEndSlot();
dropdownEndSlot.getStyle().set("display", "block");
dropdownEndSlot.appendChild(component.getElement());
}
虽然这不是一个完美的解决方案,但像这样的东西可能会做到:
@Route("")
public class TestView extends VerticalLayout {
public TestView() {
CustomComponent cc = new CustomComponent();
Div testElement = new Div(new Span("IT WORKED !!!!"));
testElement.setId("IT-WORKED");
cc.addSlot001Content(testElement);
cc.openOverlay();
add(cc);
}
}
@Tag("custom-component")
@JsModule("./custom-component.ts")
public class CustomComponent extends LitTemplate {
@Id(value = "overlay")
private Element overlay;
@Id(value = "slot001")
private Element slot;
public void openOverlay() {
overlay.setAttribute("opened", "true");
}
public void addSlot001Content(Component component) {
slot.appendChild(component.getElement());
}
}
import { LitElement, html, customElement } from 'lit-element';
@customElement('custom-component')
export class CustomComponent extends LitElement {
render() {
return html`
<vaadin-overlay id="overlay">
<div id="slot001"></div>
</vaadin-overlay>`;
}
}