gpt4 book ai didi

java - GWT JSNI方法曝光

转载 作者:行者123 更新时间:2023-11-29 17:17:31 25 4
gpt4 key购买 nike

我有一个关于使用 JSNI 公开我的 GWT 方法之一的问题。

我试图在我的 GWT 类之一中公开一种方法,该方法会向其他 UI 组件触发消息。

在我的应用程序入口点,我将其公开

   public native void exportMethods() /*-{
$wnd.fireFoo=$entry(this.@myPackage.class_a::fireFoo(Ljava/lang/String;));
}-*/;

class_a 更新其字段之一,然后从 class_b 调用静态方法。

   public class class_a{

private String last_msg;

public void fireFoo(String msg){
this.last_msg = msg;
class_b.foo(msg);
}
}

class_b 调用许多其他类和静态方法来处理消息

   public class class_b{
public static void foo(String msg){
...//creates a message object and sends it to UI components
class_c.foo2(msg);
...
}

}

基本上,我需要做的就是传递一个字符串并调用一个 GWT 方法。该方法(当从 GWT 而非手写 JS 调用时)完美运行。我还验证了暴露的方法会触发一个简单的警报。我认为问题在于调用其他类的方法。

我得到:“(TypeError) 无法获取未定义或空引用描述的属性‘hv’。”

有没有一种方法可以将字符串传递给原始 GWT 方法,而不必公开它最终会运行的无数其他方法?

最佳答案

就像在 JavaScript 中一样,this.@myPackage.class_a::fireFoo(Ljava/lang/String;) 是对方法的引用,但它不绑定(bind) 该方法到当时的 this 对象。方法内部的 this 将在调用函数时确定,而不是检索引用时。

因此您需要一个代表:

var that = this;
$wnd.fireFoo = $entry(function(s) {
that.@myPackage.class_a::fireFoo(Ljava/lang/String;)(s);
});

如果它确实像您所说的那样在 DevMode 中工作,那么它是 DevMode 中的一个错误。

关于java - GWT JSNI方法曝光,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15931541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com