4 Stimmen

GWT- Wie ruft man eine INSTANCE Java Methode von Handwritten JavaScript auf?

Ich muss eine Java-Instanzmethode aus handgeschriebenem Javascript aufrufen. In der GWT-Dokumentation wird erklärt, wie dies mit statischen Methoden und Klassen zu tun, und es funktioniert gut:

http://code.google.com/p/google-web-toolkit-doc-1-6/wiki/DevGuideJavaFromJavaScript (Aufruf einer Java-Methode aus handgeschriebenem JavaScript)

public MyUtilityClass
{
    public static int computeLoanInterest(int amt, float interestRate, 
                                          int term) { ... }
    public static native void exportStaticMethod() /*-{
       $wnd.computeLoanInterest =
          @mypackage.MyUtilityClass::computeLoanInterest(IFI);
    }-*/;
}

Ist es möglich, dies zu tun? Ich habe verschiedene Kombinationen ausprobiert, indem ich die nativen Methoden deklariert und this.@ und instance.@ verwendet habe - ohne Erfolg.

Danke

5voto

David Nouls Punkte 1875

Sicherlich ist es möglich, dies zu tun, aber Ihre Syntax ist falsch. Ich tippe dies ohne Kompilierung, also könnte ich einige Tippfehler haben. Aber so mache ich es. Der Grund, warum Ihr Ansatz nicht funktioniert, ist, dass die Variable this nicht das ist, was Sie erwarten würden.

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

1 Stimmen

Beachten Sie, dass es auch ein Projekt namens GwtExporter gibt, das die JSNI-Aufrufe von Hand schreiben kann. Ich habe es noch nicht verwendet, aber die Idee ist sehr interessant.

0 Stimmen

Wie übergibt man dies ---> (Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater) von javascript zu gwt-java code

3 Stimmen

Diese Methoden sollten nicht statisch sein

5voto

sumo Punkte 145

Ich weiß, dass dieser Artikel schon alt ist, aber ich hatte Mühe, ihn zum Laufen zu bringen, da die Antwort von David Nouls für mich nicht vollständig war. Ich musste es so abändern, dass initComplete() meine Instanzmethode initComplete() aufruft

public static native void exportInitCallback(MyComponent thiz) /*-{
    $wnd.initComplete = function (){
        thiz.@my.package.client.MyComponent::initComplete()();
    }

}-*/;

Bei der Erstellung von MyComponent habe ich diese zu meiner statischen Methode. Die globale initComplete-Methode rief dann korrekt die Instanzmethode auf.

Ich hoffe, dies hilft einigen anderen GWT-Neulingen.

1voto

Tomer Punkte 590

Die Antwort von David Nouls funktioniert, mit einer Korrektur:
das Schlüsselwort static aus den Methodendeklarationen entfernen.

0voto

Igor Klimer Punkte 15301

Könnten Sie den Code veröffentlichen, der lautet no arbeiten? :)

Aber so wie ich das sehe, this.@ wird nicht funktionieren, weil Sie kein Objekt dieser Klasse haben (in der handgeschriebenen JS, das heißt) und es wäre dasselbe, als ob Sie eine Instanzmethode einer Klasse aufrufen würden, ohne vorher ein Objekt dieser Klasse zu erstellen.

instance.@ sollte funktionieren, aber Sie müssen sicherstellen, dass die instance zeigt auf eine gültige Instanz der Klasse zum Zeitpunkt des Funktionsaufrufs aus dem handschriftlichen JS.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X