2009-06-11 16 views
10

Tengo un método Javascript nativo en una de mis clases GWT Java, pero tengo problemas para llamar a mis métodos Java desde el código JavaScript nativo. Intenté seguir this tan de cerca como pude, pero no puedo hacer que funcione. Lo compilé y lo ejecuté en Firefox, y la consola de error dijo "Error: this.lc no es una función". Intenté cambiar todos los métodos a public, pero eso no pareció marcar la diferencia. ¿Qué estoy haciendo mal?Método nativo de Javascript en 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); 
}-*/; 

Respuesta

11

En todo el código que he hecho en el pasado, nunca he utilizado 'esto' para identificar mi clase, me he pasado la clase en

Ej:. Cambiar esta situación:

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); 
}-*/; 

a esto:

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

¡Perfecto! Esto tiene sentido, pero me gustaría que estuviera mejor documentado en el sitio de GWT. – DLH

4

he encontrado una manera mejor. Es similar a lo que haces en JavaScript, donde configuras "var that = this". Usando este enfoque, no es necesario pasar esto a 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); 
} 
Cuestiones relacionadas