GWT-如何从手写JavaScript调用实例Java方法?
我需要从手写Javascript调用一个实例Java方法。在GWT文档中,解释了如何使用静态方法和类执行此操作,并且效果良好: (从手写JavaScript调用Java方法) 有可能这样做吗?我尝试了几种不同的组合,声明了本机方法并使用了。@和实例。@但没有成功GWT-如何从手写JavaScript调用实例Java方法?,gwt,Gwt,我需要从手写Javascript调用一个实例Java方法。在GWT文档中,解释了如何使用静态方法和类执行此操作,并且效果良好: (从手写JavaScript调用Java方法) 有可能这样做吗?我尝试了几种不同的组合,声明了本机方法并使用了。@和实例。@但没有成功 谢谢您能发布不起作用的代码吗?:) 但在我看来,this.@将不起作用,因为您没有该类的对象(也就是说,在手写JS中),这与您调用一个类的实例方法而不首先创建该类的对象是一样的 instance.@应该可以工作,但是您必须确保实例在从手
谢谢您能发布不起作用的代码吗?:) 但在我看来,
this.@
将不起作用,因为您没有该类的对象(也就是说,在手写JS中),这与您调用一个类的实例方法而不首先创建该类的对象是一样的
instance.@
应该可以工作,但是您必须确保实例
在从手写JS调用函数时指向类的有效实例。确保可以这样做,但语法错误。我没有编译就输入了这个,所以我可能会有一些输入错误。但我就是这样做的。您的方法不起作用的原因是,此变量的大小与您预期的不同
public MyUtilityClass{
public static int computeLoanInterest(int amt, float interestRate, int term) { ... }
public static native void exportStaticMethod() /*-{
var _this = this;
$wnd.computeLoanInterest = function(amt,interestRate,term) {
_this.@mypackage.MyUtilityClass::computeLoanInterest(IFI)(amt,interestRate,term);
};
}-*/;
}
David Nouls的答案有效,但有一处更正:
从方法声明中删除static关键字。我意识到这很旧,但我很难让它工作,因为David Nouls的答案对我来说并不完整。为了让initComplete()调用我的实例方法initComplete(),我不得不对其进行这样的调整 在构造MyComponent时,我将其传递给了静态方法。然后,全局initComplete方法正确地调用了实例方法
我希望这对其他GWT新手有所帮助。请注意,还有一个名为GwtExporter的项目,它可以删除JSNI调用所需的笔迹。我还没有用过它,但是这个想法很有趣。如何将这个-->(上下文、元素父级、字符串值、NativeEvent事件、ValueUpdater ValueUpdater)从javascript传递到gwt java代码这些方法不应该是静态的。这真的是答案吗??这很奇怪,因为我看到这些方法仍然是静态的。这是如何解决您的问题的@Chinesco?
public MyUtilityClass{
public static int computeLoanInterest(int amt, float interestRate, int term) { ... }
public static native void exportStaticMethod() /*-{
var _this = this;
$wnd.computeLoanInterest = function(amt,interestRate,term) {
_this.@mypackage.MyUtilityClass::computeLoanInterest(IFI)(amt,interestRate,term);
};
}-*/;
}
public static native void exportInitCallback(MyComponent thiz) /*-{
$wnd.initComplete = function (){
thiz.@my.package.client.MyComponent::initComplete()();
}
}-*/;