GWT JSNI - проблема передачи строк - PullRequest
5 голосов
/ 08 марта 2011

Я пытаюсь предоставить некоторые функции в моем проекте 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);
 }
}-*/;

, который выбросит java.lang.ClassCastException в консоль FireBug, хотя alert срабатывает просто отлично. Предложения?

Ответы [ 2 ]

7 голосов
/ 08 марта 2011
private native void publish(EntryPoint p) /*-{
 $wnd.setText = function(from) {
  alert(from);
  p.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
 }
}-*/;

Не могли бы вы попробовать этот код?

7 голосов
/ 08 марта 2011

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)
});
...