2016-09-22 1 views
0

Ich habe mein Gehirn für den besseren Teil von zwei Tagen. Ich habe die Dokumentation über JSNI here sowie ein paar verschiedene Blog-Beiträge auf JSNI gelesen und Variablen wie this one übergeben und nichts deutet darauf hin, dass ich etwas falsch mache. Im Wesentlichen versuche ich von meiner GWT Client Side-Klasse aus eine Javascript-Methode aufzurufen, die ich in JavaScript exportiert, wenn meine Klasse geladen wird. Diese Methode verwendet Parameter von einer anderen JS-Methode und speichert sie in der Instanz der Java-Klasse, die ich übergeben habe. Das scheint zu funktionieren. Aber sobald ich diese Methoden in meinem Java-Code referenziere, sind sie undefiniert. Ich glaube, dass meine Java-Klasseninstanz irgendwie verloren geht, nachdem der JS fertig ist. Hier ist ein Code, um den Workflow zu erklären ...GWT JSNI - Java To Javascript Zurück zu Java Ergebnisse in undefined params

Ich habe eine Java-Klasse namens ProfileWidgee. Diese Klasse verfügt über eine Methode zum Festlegen lokaler Variablen für Position, Breite und Länge. Diese Methode Name ist ...

public void handleTargetPicked(String mloc, String mlat, String mlng) { 
    loc = mloc.equalsIgnoreCase("undefined") ? "" : mloc; 
    lat = mlat.equalsIgnoreCase("undefined") ? "" : mlat; 
    lng = mlng.equalsIgnoreCase("undefined") ? "" : mlng; 
    Window.alert("setting on js side" + loc + lat + lng); 
} 

Das Verfahren zum JS als Funktion exportiert wird eine JSNI Methode namens exportMyFunction ...

public static native void exportMyFunction(ProfileWidgee instance)/*-{ 
    $wnd.handleTargetPicked = $entry(
     [email protected]::handleTargetPicked(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)); 

}-*/; 

Das alles scheint gut zu gehen. Es exportiert und ich bin in der Lage, die handleTargetPicked in meinem JS zu nennen wie folgt ...

handleTargetPicked(encodeURIComponent(place.formatted_address), 
    encodeURIComponent(place.geometry.location.lat()), 
    encodeURIComponent(place.geometry.location.lng())); 

All dies scheint zu funktionieren und die Window.alert() zeigt die richtigen Werte. Das führt mich zu der Annahme, dass es die geeignete Instanz meiner Klasse hat und dass es die Variablen entsprechend setzt. Später, wenn ich wieder in meiner Java-Klasse bin, versuche ich diese Variablen zu referenzieren und sie kommen immer als 'undefiniert' zurück.

Dies führt zu 'undefined' für alle drei Werte. Meine große Frage ist also ... ist es möglich, einen Wert in Ihrer Java-Klasse von der JS-Seite aus festzulegen und diesen Wert später in Ihrer Klasse zu verwenden?

+0

Konnte nie eine Antwort auf diese erhalten, also habe ich am Ende DB Funktionen aufgerufen, um Werte in der Datenbank zu speichern und sie dann auf beiden Seiten zu ziehen. – Phil

Antwort

2

Ich bin gerade in eine ähnliche Situation gerannt und habe zufällig deinen Post gesehen. Ich konnte nirgendwo eine Lösung finden, also habe ich versucht, es selbst zu debuggen.

Was ich sah war, 'diese' Variable zeigte auf Fenster und nicht auf die Objektinstanz.

Also anstatt das Verfahren direkt wie z.B. handleTargetPicked (arg1, arg2), habe ich method.call() verwendet und den Kontext wie z. handleTargetPicked.call (Instanz, arg1, arg2). Dieser Ansatz löste das Problem für mich. Ich hoffe, das hilft.

+0

Dies ist in der Tat das Problem. Die Methode sollte als Aufruf in einer Funktion exportiert werden, um die richtige 'this'-Bindung zu erhalten: $ entry (Funktion (loc, lat, lng)) {Instanz. @ :: handleTargetPicked (*) (loc, lat, lng); }) ' –

+0

Ich bin auch bei diesem fest, können Sie die richtige Signatur für das gleiche bereitstellen. ist das richtig? 'öffentliche statische native void exportMyFunction (ProfileWidgee-Instanz)/* - {$ wnd.handleTargetPicked = $ -Eintrag (instance. @ Com.njclient.widgees.profile.ProfileWidgee :: handleTargetPicked (Lcom/n/j/Client/Widgets/profile/ProfileWidgee, Ljava/lang/Zeichenfolge; Ljava/lang/String; Ljava/lang/String;)); } - * /; ' – Abhishek2k6

+0

oder öffentliche statische native void exportMyFunction (ProfileWidgee-Instanz)/* - {$ wnd.handleTargetPicked = $ -Eintrag (instance. @ Com.n.j.client.widgees.profile.ProfileWidgee :: handleTargetPicked (this; Ljava/lang/Zeichenfolge; Ljava/lang/String; Ljava/lang/String;)); – Abhishek2k6

Verwandte Themen