I am working on a new class and I want to expose instance fields and
methods via a prototype via JSNI so I can call from third party script
into my GWT code like this.
var mySimpleObject = new Simple("test");
test.callMyName();
I have been working through a series of examples that build on each
other but I am not sure that my assumptions about why the ones that
work really work and why the ones that fail really fail.
Here they are -- JSNI experts please comment!
Thanks!
package com.test.client;
public class Simple {
public String name;
public Simple(String name) {
this.name = name;
}
public static Simple createSimple(String name) {
return new Simple(name);
}
// this works becuase you are passing in the Simple reference
public native void callMyNameWorks(Simple myInstance)
/*-{
$wnd.callMyName = function(){
alert( [EMAIL PROTECTED]::name);
}
alert( [EMAIL PROTECTED]::name);
$wnd.callMyName();
}-*/;
// this works because we COPY the reference and store it in a
closure.
public native void callMyNameWorks()
/*-{
var myInstance = this;
$wnd.callMyName = function(){
alert( [EMAIL PROTECTED]::name);
}
//"this" in GWT entrypoint is the Simple object that called this
method.
alert( [EMAIL PROTECTED]::name);
$wnd.callMyName();
}-*/;
// this broken because "this" is not the right object when our new
function
// gets called.
public native void callMyNameHalfBroken()
/*-{
$wnd.callMyName = function(){
//this will break because at "this" is actually the window object
now (or who called the method)
alert( [EMAIL PROTECTED]::name);
}
//"this" works b/c GWT entrypoint is the Simple object that called
this method.
alert( [EMAIL PROTECTED]::name);
$wnd.callMyName();
}-*/;
public static native void callMyNameStaticGlobalWorks()
/*-{
//---------------------------------------
//NOTE: this RETURNS the GWT Simple Object not a js object
//---------------------------------------
$wnd.jsSimple = function (name){
return
@com.siemens.soarian.sf.uiarch.client.Simple::createSimple(Ljava/lang/
String;)(name)
}
//myObject must be an instance of the GWT Simple Object
$wnd.callMyNameGlobal = function(myGwtJavaObject){
alert([EMAIL PROTECTED]::name);
}
var myJsSimple = new $wnd.jsSimple("testing");
//works bc we pass in the actual GWT Java Simple object
$wnd.callMyNameGlobal(myJsSimple);
}-*/;
public static native void callMyNameStaticGlobalBroken()
/*-{
debugger;
//---------------------------------------
//NOTE: effectively assigns the value of var name = javascript
instance of gwt java object
//if you look at the object in debug you will see name.instance is
now defined.
//name.instance is a reference to the gwt object
//---------------------------------------
$wnd.jsSimple = function (name){
this.instance =
@com.siemens.soarian.sf.uiarch.client.Simple::createSimple(Ljava/lang/
String;)(name);
}
//myObject must be an instance of the GWT Simple Object
$wnd.callMyNameGlobal = function(myobject){
alert([EMAIL PROTECTED]::name);
}
//debug shows that there is now a name.instance defined;
var myJsSimple = new $wnd.jsSimple("testing");
$wnd.callMyNameGlobal(myJsSimple);
}-*/;
public static native void callMyNameStaticLocalBroken()
/*-{
debugger;
//---------------------------------------
//NOTE: effectively assigns the value of var name = javascript
instance of gwt java object
//if you look at the object in debug you will see name.instance is
now defined.
//name.instance is a reference to the gwt object
//---------------------------------------
$wnd.jsSimple = function (name){
this.instance =
@com.siemens.soarian.sf.uiarch.client.Simple::createSimple(Ljava/lang/
String;)(name);
}
//store a copy of the prototype reference to use later
var _= $wnd.jsSimple.prototype;
_.callMyNameLocal = function(){
//who is this when its called? it won't be a GWT Java Simple
object!!!
//it is actually the javascript object -- So the myInstance[blah
blah] will be undefined
var myInstance = this;
alert([EMAIL PROTECTED]::name);
}
var myJsSimple = new $wnd.jsSimple("testing");
myJsSimple.callMyNameLocal();
}-*/;
public static native void callMyNameStaticLocalWorks1()
/*-{
debugger;
//---------------------------------------
//NOTE: effectively assigns the value of var name = javascript
instance of gwt java object
//if you look at the js object in debug you will see name.instance
is now defined.
//name.instance is a reference to the gwt object
//---------------------------------------
$wnd.jsSimple = function (name){
this.instance =
@com.siemens.soarian.sf.uiarch.client.Simple::createSimple(Ljava/lang/
String;)(name);
}
//store a copy of the prototype reference to use later
var _= $wnd.jsSimple.prototype;
_.callMyNameLocal = function(){
//is say "this" then will be broken because when method is called
the this is the js object
//this.instance = the java object
alert([EMAIL PROTECTED]::name);
}
var myJsSimple = new $wnd.jsSimple("testing");
myJsSimple.callMyNameLocal();
}-*/;
public static native void callMyNameStaticLocalWorks2()
/*-{
debugger;
//---------------------------------------
//NOTE: effectively assigns the value of var name = javascript
instance of gwt java object
//if you look at the object in debug you will see name.instance is
now defined.
//name.instance is a reference to the gwt object
//---------------------------------------
$wnd.jsSimple = function (name){
this.instance =
@com.siemens.soarian.sf.uiarch.client.Simple::createSimple(Ljava/lang/
String;)(name);
}
//store a copy of the prototype reference to use later
var _= $wnd.jsSimple.prototype;
_.callMyNameLocal = function(){
//make a copy of the reference the gwt java object so we can use it
later when this method
//is actually called since this.instance has the right obj ref when
the object is created?
var myInstance = this.instance;
alert([EMAIL PROTECTED]::name);
}
var myJsSimple = new $wnd.jsSimple("testing");
myJsSimple.callMyNameLocal();
}-*/;
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Google Web Toolkit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---