2009-06-11 2 views
10

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

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 { 
       [email protected]_lab.client.ValueBox::increaseValue()(); 
      } 
      [email protected]_lab.client.ValueBox::fireChange()(); 
     } 
    } 

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

ответ

11

Во все коде я сделал в прошлом, я никогда не использовал «это», чтобы определить мой класс, я прошел класс в

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

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 { 
         [email protected]_lab.client.ValueBox::increaseValue()(); 
       } 
       [email protected]_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 { 
         [email protected]_lab.client.ValueBox::increaseValue()(); 
       } 
       [email protected]_lab.client.ValueBox::fireChange()(); 
     } 
    } 

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

Отлично! Это имеет смысл, но я бы хотел, чтобы он был документально подтвержден на сайте GWT. – DLH

4

Я нашел лучший способ. Это похоже на то, что вы делаете в 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) { 
    [email protected]::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); 
} 
Смежные вопросы