我正在try 将我的自定义VIS组件添加到MainView VerticalLayout.但是它被呈现在布局的上方,并且布局本身包含一个空的组件标记.

Custom component code

这里,我将我的组件标记为"div"

@JsModule("./visjs-test.js")
@NpmPackage(value = "vis", version = "0.110.0")
@Tag("div")
public class VisJs extends Component {

    public VisJs(List<VisJsEdge> edges, List<VisJsNode> nodes) throws JsonProcessingException {
        ObjectWriter owForEdges = new ObjectMapper().writer().withDefaultPrettyPrinter();
        ObjectWriter owForNodes = new ObjectMapper().writer().withDefaultPrettyPrinter();

        String jsonEdges = owForEdges.writeValueAsString(edges);
        String jsonNodes = owForNodes.writeValueAsString(nodes);

        getElement().executeJs("window.initThree($0, $1, $2)", this, jsonEdges, jsonNodes);
    }
}

visjs-test.js:

在这里,我填充了future 网络的 node 和边缘,并试图渲染它

import {DataSet, Network} from "vis";

class VisJsTest {
    init(element, edges, nodes) {
        this.element = element;

        var loadedNodes = JSON.parse(nodes);
        
        var _this = this;
        var step;
        for (step = 0; step < loadedNodes.length; step++) {
            loadedNodes[step] = this.fillNode(loadedNodes[step]);
        }
        this.nodes = new DataSet(loadedNodes);
        
        var loadedEdges = JSON.parse(edges);
        for (step = 0; step < loadedEdges.length; step++) {
            loadedEdges[step] = this.fillEdge(loadedEdges[step]);
        }
        this.edges = new DataSet(loadedEdges);

        this.container = document.getElementById("outlet");
        
        this.data = {
            nodes: this.nodes,
            edges: this.edges,
        };
        var options = {};
        this.network = new Network(this.container, this.data, options);
}

Rendered HTML

<div id="outlet">
   <!-- Network is here, but not must be -->
   <div class="vis-network" tabindex="900" style="position: relative; overflow: hidden; touch-action: pan-y; user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); width: 100%; height: 100%;">
      <canvas style="position: relative; touch-action: none; user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); width: 100%; height: 100%;" width="1260" height="563"></canvas>
   </div>
   <flow-container-root-2521314 id="ROOT-2521314" style="">
      <vaadin-vertical-layout theme="padding spacing" id="mainview" style="width: 100%;">
         ...
         <vaadin-button tabindex="0" role="button">Add node</vaadin-button>
         <vaadin-horizontal-layout theme="spacing">
            <vaadin-upload target="VAADIN/dynamic/resource/3/c968ce30-4fc1-4e36-8d06-ddba9ecfbfd1/upload"></vaadin-upload>
            <vaadin-button disabled="" tabindex="-1" aria-disabled="true" role="button">Load data to XML</vaadin-button>
         </vaadin-horizontal-layout>
         ... 
         <div></div> <!-- Network must be here -->
         ...
      </vaadin-vertical-layout>
   </flow-container-root-2521314>
</div>

推荐答案

发生这种情况是因为您的组件没有设置元素的"id".在您的例子中,意外地有另一个带有id=Outlet的div,您的JAVASCRIPT document.getElementById("outlet");找到了它,并将其用作构建Network的元素.

我会这样做的

@JsModule("./visjs-test.js")
@NpmPackage(value = "vis", version = "0.110.0")
@Tag("div")
public class VisJs extends Composite<Div> {

    public VisJs(List<VisJsEdge> edges, List<VisJsNode> nodes) throws JsonProcessingException {
        String id=randomId(10);
        setId();
        ...
        getElement().executeJs("window.initThree($0, $1, $2)", this, jsonEdges, jsonNodes, id);
    }
    
    private String randomId(int chars) {
        int limit = (10 * chars) - 1;
        String key = "" + rand.nextInt(limit);
        key = String.format("%" + chars + "s", key).replace(' ', '0');
        return "vis-" + key;
    }

并自然地更新您已设置为windowinitThree函数以使用该id参数.

您需要 for each 组件实例拥有唯一的ID.这样,您可以在同一视图上创建多个构件.否则,新的情况会毁了旧的情况.

Javascript相关问答推荐

同步功能在中间停止

试图为每支球队生成类似于2024/25年欧洲足联冠军联赛瑞士系统格式的独特比赛配对

在HTML中使用脚本变量作为背景图像源

如何使用Paged.js仅渲染特定页面

Flisk和JS错误:未捕获的Syntax错误:意外的令牌'<'

使用TMS Web Core中的HTML模板中的参数调用过程

使用续集和下拉栏显示模型属性

当Redux提供程序访问Reduxstore 时,可以安全地从Redux提供程序外部调用钩子?

加载背景图像时同步旋转不显示的问题

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

JS:XML insertBefore插入元素

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

为什么我的自定义元素没有被垃圾回收?

为什么客户端没有收到来自服务器的响应消息?

JavaScript不重定向配置的PATH

如何在我的Next.js项目中.blob()我的图像文件?

删除加载页面时不存在的元素(JavaScript)

WebSocketException:远程方在未完成关闭握手的情况下关闭了WebSocket连接.&#三十九岁;

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

为什么我不能使用其同级元素调用和更新子元素?