2016-07-15 14 views
0

Ich weiß, ich mache wahrscheinlich nur etwas Dummes, aber ich kann kein Beispiel finden, das zeigt, wie man eine Java-Methode von Javascript mit GWT aufruft.

I've followed the documentation almost verbatim where is says:

package mypackage; 

public class Account { 
private int balance = 0; 
public int add(int amt) { 
    balance += amt; 
} 

public native void exportAdd() /*-{ 
    var that = this; 
    $wnd.add = $entry(function(amt) { 
     [email protected]::add(I)(amt); 
    }); 
}-*/; 
} 

Dann können Sie es in JS nennen

$wnd.add(5); 

mit Aber das ergibt für mich in einem Fehler, der "$ wnd ist nicht definiert", sagt.

Dies ist mein Code: ich den Funktionsaufruf

public native void exportPaymentProcessComplete()/*-{ 
    var that = this; 
    console.log('exportingPaymentProcessComplete'); 
    $wnd.paymentProcessComplete = $entry(function(result){ 
     [email protected]::paymentProcessComplete(Ljava/lang/String;)(result); 
    }); 

}-*/; 

Ich habe eine einfache Funktion exportieren, die genannt werden (mit einem Haltepunkt, weil ich es noch habe zu bekommen genannt werden)

public void paymentProcessComplete(String result){ 
    if(result != null){ 

    } 
} 

Dies ist der schwierige Teil und wahrscheinlich, wo ich falsch liege. Der JSNI-Aufruf wird beim Laden von einem iframe ausgeführt. Ich denke, es hat mit dem Versuch zu tun, die JavaScript-Funktionen des Elternfensters aufzurufen, aber ich bin mir nicht sicher, wie ich auf das $ wnd-Objekt der Eltern verweisen soll.

Ich habe dies versucht:

response.getWriter().print("<script type=\"text/javascript\">parent.$wnd.paymentProcessComplete(\"SUCCESS\");</script>"); 

Was ist, wenn ich den "$ wnd ist nicht definiert" Fehler.

Und auch dies:

response.getWriter().print("<script type=\"text/javascript\">parent.paymentProcessComplete(\"SUCCESS\");</script>"); 

die mir „Kann nicht bekommen Eigenschaft‚paymentProcessComplete‘undefinierter oder Null-Referenz“ gibt. Das ist im Grunde der gleiche Fehler wie "$ wnd is undefined".

Wer hat irgendwelche Gedanken darüber, wie dies zu erreichen ist?

Antwort

1

Nach einiger tiefer Graben, entdeckte ich, dass die JSNI Code, der/Belichtungs meine JAVA-Methode wurde den Export warf einen Cast Ausnahme, weil es versucht hat, es an die Presenter-Klasse anzuhängen, an der es statt des Fensters beteiligt war.

Also dieser Code:

public native void exportPaymentProcessComplete()/*-{ 
    var that = this; 
    console.log('exportingPaymentProcessComplete'); 
    $wnd.paymentProcessComplete = $entry(function(result){ 
     [email protected]::paymentProcessComplete(Ljava/lang/String;)(result); 
    }); 
}-*/; 

wurde dieser Code:

public native void exportPaymentProcessComplete()/*-{ 
    $wnd.paymentProcessComplete = $entry(function(result){ 
     @com.ra.ec.client.checkout.CheckoutPresenter::paymentProcessComplete(Ljava/lang/String;)(result); 
    });  
}-*/; 

Welche auch die paymentProcessComplete() -Methode gemeint hatte einen statischen Modifikator es Erklärung angewendet haben.

private static void paymentProcessComplete(String result){ 
+0

Warum wurde das abgelehnt? Es ist die richtige Antwort. – Miniversal

0

bei der Erstellung Ihrer GWT App $wnd wird durch window ersetzt. Also, wenn Sie versuchen, aus dem Inneren eines iframe eine exportierte Methode aufrufen es so nennen:
window.parent.paymentProcessComplete("SUCCESS")

+0

Das schien Dinge zu ändern. Ich bekomme einen etwas anderen Fehler "Objekt unterstützt keine Eigenschaft oder Methode 'paymentProcessComplete'". Es hört sich so an, als würde ich "$ wnd" jetzt korrekt referenzieren. Vielen Dank.:) – Miniversal