【发布时间】:2019-12-11 09:21:43
【问题描述】:
我正在使用测试数据通过 JSNI 使用名为 cytoscape.js 的外部 javascript 库。当我在我的 java 类中运行我想通过 JSNI 的脚本时,它无法生成图形。但是,当我通过 Chrome Devtools 控制台运行它时,它可以正常工作。
所有值似乎都正确传递给了 cytoscape.js 库。目前,JSNI 代码未能通过控制台代码能够通过的 Javascript 库执行的测试。
这是我正在使用的 JSNI 代码:
public static native void cytoscape() /*-{
var cy = $wnd.cy = $wnd.cytoscape({container: $wnd.document.getElementById('cy'),
elements: $wnd.glyElements,
style: [ { selector: 'node', style: { 'background-color': '#666', 'label': 'data(id)' } },
{ selector: 'edge', style: { 'width': 3, 'line-color': '#ccc', 'target-arrow-color': '#ccc', 'target-arrow-shape': 'triangle' } } ],
layout: { name: 'grid', rows: 1 } });
}-*/;
“$wnd”。用于获取正确的范围。
这是控制台代码:
var cy = window.cy = cytoscape({
container: document.getElementById('cy'),
elements: glyElements,
style: [ { selector: 'node', style: { 'background-color': '#666', 'label': 'data(id)' } }, { selector: 'edge', style: { 'width': 3, 'line-color': '#ccc', 'target-arrow-color': '#ccc', 'target-arrow-shape': 'triangle' } } ],
layout: { name: 'grid', rows: 1 }
});
我在这两种情况下使用的元素都存储在一个 .js 文件中,并且我确保它们在这两种情况下都可以访问。就像我提到的,Devtools 调试显示正确的值被传递到 cytoscape.js 库中。
JSNI 代码未能通过 cytoscape.js 库中的此返回语句:
var plainObject = function plainObject(obj) {
return obj != null && _typeof(obj) === typeofobj && !array(obj) && obj.constructor === Object;
};
如果我注释掉“&& obj.constructor === Object;”在 cytoscape.js 的第 145 行,代码可以使用我的 JSNI 脚本正确运行。这让我相信通过 JSNI 创建 cytoscape 对象的方式与通过控制台不同。尽管如此,开发工具将控制台和 JSNI 方法列为提供相同的对象。如何更新我的 JSNI 代码以使其符合此检查?
理想情况下,JSNI 应该在这种情况下可用。我不确定为什么通过 JSNI 传递值会导致这个 if 语句在通过控制台运行它时失败并传递 if 语句。
【问题讨论】:
标签: javascript java gwt cytoscape.js jsni