问题标签 [gwt-jsinterop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
938 浏览

java - 从 GWT ArrayList 中对 JSON 进行字符串化,然后返回到数组

当前尝试使用互操作方法在 GWT 中对 Java ArrayList 对象进行字符串化,以调用本机 JSON.stringify(ArrayListobj)。这会以数组的形式生成底层数组列表内容的完美 JSON 表示。这甚至适用于看似更复杂的 Java 类对象,但在本例中,我将使用字符串来演示。首先在我的创作方面:

现在基于我的 JsInterop 代码,我返回一个对象(或对象数组,如下面的代码所示):

到目前为止一切顺利,所有这些都完美运行,我得到的结果是 ArrayList 内容的字符串化 JSON 表示

"{"array_0":["first","second"]}"

然后通过解析器运行这个位:

并且 var 是来自第一个 ArrayList 的基础数据的正确表示(当查看 web 浏览器执行暂停时)。问题是将 JSON 数组的 Object[] 转换回 Java ArrayList 对象。

我尝试使用 JSNI 代码来提取数组元素,实际上它在 Web 浏览器的控制台托盘中运行良好,但编译器试图智取我并重命名数组元素,因此我的 JSNI 代码无法触及它。

如果我的代码如上,并且我编写 JSNI 类似:

然后编译器将重命名数组array_0,这样我的代码 inVal.array 就不再与我试图访问的数据相关联。

从我所做的所有测试来看,这是迄今为止从客户端软件中的一个位置到客户端软件中的另一个位置(没有服务器)获取相同 ArrayList 对象(保证在两个地方以相同方式定义)的最快方法这里涉及)通过字符串化。

但是关于如何在 GWT 中低级别操作 JavaScript 的信息充其量是缺乏的。

而且我已经尝试了 GWT-RPC 机制、GWT-Jackson、AutoBeans 的所有变体(如果它们支持具有多种原始类型的对象!)requestbuilder,你可以命名它。

不,在您提出建议之前,我对再次对字符串进行完整的 GWT-JSON 解析不感兴趣,当最初将数千条记录从服务器中拉出并将它们推送到 Java ArrayList 时,我已经这样做了。在 GWT 中解析 JSON 需要 200+mS,而浏览器 JSON 解析函数处理这个字符串大约需要 3mS。

0 投票
2 回答
470 浏览

gradle - JsInterop“com 未定义”

尝试使用 JsInterop 通过 Javascript 与 LibGDX 项目进行通信。我在这里遵循“将 Java 类型导出到 JavaScript”示例。它不起作用:Uncaught ReferenceError 'com' is not defined。我没有得到任何错误gradle

我已经:

  1. 检查 generateJsInteropExports 是否启用:

My GdxDefinition.gwt.xml

我在想,也许入口点HtmlLauncher也应该是 a @JsType,但这也不起作用。

  1. 还检查了 generateJsInteropExports 是否启用GdxDefinitionSuperdev.gwt.xml

  2. 以不同的方式访问浏览器控制台中的类,例如:

.

我是这样编译的:

我的课(在 html 模块中,也在核心模块中尝试过,仍然不起作用)看起来像这样:

我的想法不多了。somenody 可以帮我弄清楚该怎么做才能使它起作用。

一些可能有用的信息:

我的代码html.gradle

我的代码project gradle

更新 1

我检查了 Colin Alworth 的答案和他发布的链接。它仍然不起作用。我变了:

就像这里所说那样。

我这样称呼:gradlew.bat html:dist --daemon并且我generateJsInteropExports从 GdxDefinition 文件中删除了该属性,因为它似乎是错误的。

现在我得到以下编译错误:

这是为什么?

0 投票
1 回答
114 浏览

gwt - 在 jsinterop 中哪里可以找到 LinkedHashSet?

我在 GWT 中有以下实体

当我myEntityVar.getTexts()在 Javascript 中调用时,返回的对象是一个 HashSet。似乎 jsinterop 将 HashSet 的 java 实现转换为 JavaScript。但是我怎样才能在 JavaScript 中创建一个新的 HashSet 以便使用myEntityVar.setTexts(texts)呢?我为“文本”参数尝试了一个数组,但这不起作用。所以我不知何故需要在 JavaScript 中使用 HashSet。但是,我不知道在哪里可以找到它。任何想法?

0 投票
2 回答
77 浏览

gwt - 漏洞?JsNumber toFixed 在 SuperDev 和 JS 中返回不同的值

我正在使用 GWT 2.8.2。

当我在 SuperDev 模式下运行以下代码时,它会记录123.456,这是我所期望的。

当我编译成 JavaScript 并运行时,它会记录123(即它不显示小数位)。

我尝试在 Android Chrome、Windows Chrome 和 Windows Firefox 上运行代码。它们都表现出相同的行为。

知道为什么会有差异,我能做些什么吗?


更新:经过一番挖掘,我发现这与整数参数的强制有关。

似乎JsNumberElemental2 中的类已将签名定义为:

我认为应该是:

我仍然不确定为什么它在 SuperDev 模式下工作而不是在编译时工作。

0 投票
1 回答
119 浏览

java - 如何在 Wicket 中运行 GWT 应用程序?

我是 GWT 的新手。我有 Wicket 应用程序并想在其中一个面板中运行 GWT 应用程序。两者都使用maven。

  • 我应该从检票口中的 GWT 调用入口点类吗?
  • 如何与 GWT XML 配置交互?
0 投票
0 回答
167 浏览

gwt - 在 Web 组件中包装 GWT 小部件

我正在尝试将 gwt 与 Web 组件一起使用,我想通过包装它们来重用一些小部件(并在微前端场景中使用它们,但一次一步)。我jsinterop在一个虚拟项目中使用,但我不能在 javascript 部分使用我的小部件。我使用@JsType 来共享一些类(小部件和它们必须呈现的内容),这是我的简单 Web 组件的片段:

当组件连接时,我得到:

我正在使用带有标志gwt 2.8.1的 mojo来使用 JsInterop。您可以在此处找到该项目。gwt-maven-plugin 2.8.1<generateJsInteropExports>true</generateJsInteropExports>

0 投票
1 回答
228 浏览

gwt - GWT JsInterop - 在 JavaScript 中扩展 Java 接口

因此,我们正在尝试使用 JsInterop,以便在我们的 GWT 应用程序中,我们可以使用在 JavaScript 中外部创建的一些模块。

我们有一个接口,它有一些契约,一些方法必须由所有视图实现。

例如:

现在想象一下,在 JS 端,我们有那个接口的实现:

这能行吗?目前,我有一个错误说:Class extends value undefined is not a constructor or null

0 投票
1 回答
99 浏览

gwt - Js.cast() 如何进行类型检查?

我将 GWT 2.9 与 elemental2-1.0.0-RC1 一起使用。

以下代码ClassCastException在运行时抛出 a:

当我改为使用 anJs.uncheckedCast()时,它会成功:

的文档Js.uncheckedCast()说:

“你应该总是更喜欢定期铸造而不是这个(除非你知道你在做什么!)。”

我不知道为什么我必须使用它,所以我感到很紧张。有人可以解释如何Js.cast()执行其类型检查以及为什么我需要Js.uncheckedCast()在这种情况下使用 an 吗?

0 投票
1 回答
150 浏览

gwt - 用于 Java 原始对象包装类的 JsInterop

GWT 通过 JsInterop 开箱即用地提供集合类,但对于 Integer、Long、Char 等(原始对象包装类)则不然。

这有什么原因吗?

为了通过 JsInterop 使这些 Java 模拟类可用,我需要将它们复制到我自己的源中,将它们放在与 gwt-user 中的相同的包中,然后手动修改它们以使用 JsType(并修复所有方法名称冲突,以及通过 JsInterop 只提供一个构造函数)。

除了这样做之外,还有什么更简单的方法可以实现吗?

0 投票
0 回答
37 浏览

java - GWT - 在服务工作者中使用编译代码 (JsInterop)

我正在尝试使用 JsInterop 从服务人员调用已编译的 gwt 代码。我只是想使用教程类进行测试:

据我所知,我必须使用 -generateJsInteropExports 标志,但我不想导入我的入口点 GWT 模块(例如'mymodule/mymodule.nocache.js'),因为它包含所有应用程序( UI)逻辑。

有没有办法为 jsinterop 输出指定 javascript 文件名?还是我必须创建另一个 gwt 模块?如果是这样,我如何指定我希望它包含 jsinterop 注释类?(因为该模块将是空的,因为没有使用这些类)