Родной метод Javascript в GWT - PullRequest
10 голосов
/ 11 июня 2009

У меня есть собственный метод Javascript в одном из моих классов GWT Java, но у меня возникают проблемы с вызовом моих методов Java из собственного кода Javascript. Я пытался следить за этим как можно точнее, но не могу заставить его работать. Я скомпилировал его и запустил в Firefox, и консоль ошибок сказала «Ошибка: this.lc не является функцией» . Я попытался изменить все методы на public , но это, похоже, не имело значения. Что я делаю не так?

package com.proprintsgear.design_lab.client;
...
public class ValueBox extends HorizontalPanel {
...
private void fireChange() {
    ...
}

private void increaseValue() {
    ...
}

private native void addNativeMouseWheelListener(String id) /*-{
    function mouseOverHandler(e) {
        $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function mouseOutHandler(e) {
        $wnd.removeEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function scrollWheelMove(e) {
        if ($wnd.event || $wnd.Event) {
            if (!e) e = $wnd.event;
            if (e.wheelDelta <= 0 || e.detail > 0 ) {
                $wnd.alert("DOWN");
            } else {
                this.@com.proprintsgear.design_lab.client.ValueBox::increaseValue()();
            }
            this.@com.proprintsgear.design_lab.client.ValueBox::fireChange()();
        }
    }

    var box=$doc.getElementById(id);
    box.addEventListener("mouseout",mouseOutHandler,false);
    box.addEventListener("mouseover",mouseOverHandler,false);
}-*/;

Ответы [ 2 ]

12 голосов
/ 12 июня 2009

Во всем коде, который я делал в прошлом, я никогда не использовал «this» для идентификации своего класса, я передал класс в.

Например: изменить это:

private native void addNativeMouseWheelListener(String id) /*-{
    function mouseOverHandler(e) {
        $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function mouseOutHandler(e) {
        $wnd.removeEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function scrollWheelMove(e) {
        if ($wnd.event || $wnd.Event) {
                if (!e) e = $wnd.event;
                if (e.wheelDelta <= 0 || e.detail > 0 ) {
                        $wnd.alert("DOWN");
                } else {
                        this.@com.proprintsgear.design_lab.client.ValueBox::increaseValue()();
                }
                this.@com.proprintsgear.design_lab.client.ValueBox::fireChange()();
        }
    }

    var box=$doc.getElementById(id);
    box.addEventListener("mouseout",mouseOutHandler,false);
    box.addEventListener("mouseover",mouseOverHandler,false);
}-*/;

К этому:

private native void addNativeMouseWheelListener(ValueBox instance, String id) /*-{
    function mouseOverHandler(e) {
        $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function mouseOutHandler(e) {
        $wnd.removeEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function scrollWheelMove(e) {
        if ($wnd.event || $wnd.Event) {
                if (!e) e = $wnd.event;
                if (e.wheelDelta <= 0 || e.detail > 0 ) {
                        $wnd.alert("DOWN");
                } else {
                        instance.@com.proprintsgear.design_lab.client.ValueBox::increaseValue()();
                }
                instance.@com.proprintsgear.design_lab.client.ValueBox::fireChange()();
        }
    }

    var box=$doc.getElementById(id);
    box.addEventListener("mouseout",mouseOutHandler,false);
    box.addEventListener("mouseover",mouseOverHandler,false);
}-*/;
4 голосов
/ 05 февраля 2013

Я нашел лучший способ. Это похоже на то, что вы делаете в JavaScript, где вы устанавливаете «var that = this». Используя этот подход, вам не нужно передавать это в listenForPostMessage ():

protected native void postMessage(String msg) /*-{
  $wnd.postMessage(msg, "*");
}-*/;

private final native void listenForPostMessage() /*-{
  var that = this;
  $wnd.addEventListener("message", function(msg) {
  that.@org.dartlang.gwtapplication.client.GwtApplication::onPostMessage(Ljava/lang/String;Ljava/lang/String;)(
    msg.data, msg.origin);
  });
}-*/;

private void onPostMessage(String data, String origin) {
  Label msgLabel = new Label();
  msgLabel.setText("GWT received a postMessage: Data: " +
      data + " Origin: " + origin);
  mainPanel.add(msgLabel);
}
...