我正在尝试在我的GWT项目中提供一些函数挂钩:
private TextBox hello = new TextBox();
private void helloMethod(String from) { hello.setText(from); }
private native void publish() /*-{
$wnd.setText = $entry(this.@com.example.my.Class::helloMethod(Ljava/lang/String;));
}-*/;
在publish()
中调用 onModuleLoad()
。但这不起作用,在开发控制台中没有提供反馈的原因。我也试过了:
private native void publish() /*-{
$wnd.setText = function(from) {
alert(from);
this.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
}
}-*/;
会在FireBug控制台中抛出java.lang.ClassCastException
,尽管alert
会很好。建议?
答案 0 :(得分:7)
helloMethod
是一种实例方法,因此当调用时,它需要设置this
引用。您的第一个示例不会在通话时执行此操作。你的第二个例子尝试这样做,但是有一点错误,可以在JavaScript中轻松搞定:
this
引用
$wnd.setText = function(from) {
this.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
};
指向函数本身。为避免这种情况,您必须执行以下操作:
var that = this;
$wnd.setText = function(from) {
that.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
};
或更好:
var that = this;
$wnd.setText = $entry(function(from) {
that.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from)
});
答案 1 :(得分:7)
private native void publish(EntryPoint p) /*-{
$wnd.setText = function(from) {
alert(from);
p.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
}
}-*/;
你能尝试一下这段代码吗?