1 回答
TA贡献1818条经验 获得超7个赞
问题在于 Object 与 Object 并不完全相同,而且检查instanceof几乎肯定比 cytoscape 的作者认为的要多得多 - JS 不是很棒吗?
该cytoscape.js项目的测试不仅仅是测试“这是一个普通对象而不是其他类型的实例”,而是实际测试“这个东西是我instanceof Object窗口实例中的 Object 类的实例,而不是来自任何其他iframe /窗户”。
GWT 的默认链接器在 iframe 中评估您的代码,以防止意外泄漏全局变量和混淆加载到同一页面的 JS,或者让同一页面上的其他 JS 覆盖或以其他方式混淆 GWT 的代码。
有几种方法可以解决这个问题,除了尝试将 cytoscape 的代码更正为不那么僵化和不灵活的代码。
从外部页面创建对象的实例:为此,您必须直接创建对象,而不是使用语法{...},语法默认为您碰巧在其中执行的任何窗口。像这样:
public static native void cytoscape() /*-{
var obj = new $wnd.Object();
obj.container = $wnd.document.getElementById('cy');//can also be simply $doc.getElementById('cy')
obj.elements = $wnd.glyElements;
// Note that you may have to repeat this for each of these nested objects, depending
// on how picky the library is being on otherwise identically structured code...
obj.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' } } ];
obj.layout = { name: 'grid', rows: 1 };
var cy = $wnd.cy = $wnd.cytoscape(obj);
}-*/;
将 cytoscape.js 加载到执行 GWT 代码的同一个 iframe 中。请注意,它实际上可能无法在那里工作,这会导致其他问题,但您可以尝试使用 ScriptInjector 将脚本内容插入 GWT 应用程序而不是引用它直接在您的 .html 页面中。
添加回答
举报