[Proto-Scripty] Re: Scope of variables when bindAsEventListener and Ajax Request

2011-04-18 Thread kstubs
Thanks, and no apologies necessary for the *complete* response!  Why global 
variables?  This is a mixture of good code and bad code, so a hack together. 
 I'm tending to develop more and more with objects now (thanks to Prototype) 
in my client-side code.  I'm big on event driven code methods, and again, 
Prototype to the rescue!  Event driven code is a must in rich client apps. 
Like the grid object throwing an event, I'm done drawing myself, and then 
everyone who cares latches on to the event to do it's work.  
Anyhow... ok, so pass-by-value, duhhh!  

Thanks for the object tip.  I'll work out a better hack for my jsonDataM 
global variable.

Karl..

-- 
You received this message because you are subscribed to the Google Groups 
Prototype  script.aculo.us group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com.
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en.



[Proto-Scripty] Re: Scope of variables when bindAsEventListener and Ajax Request

2011-04-17 Thread greg
The first parameter to bindAsEventListener is the context, then come
the arguments.
So I think you can just get rid of e in line
function fetchData(e, jsonData), giving:
function fetchData(jsonData)

-- 
You received this message because you are subscribed to the Google Groups 
Prototype  script.aculo.us group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com.
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en.



[Proto-Scripty] Re: Scope of variables when bindAsEventListener and Ajax Request

2011-04-17 Thread T.J. Crowder
Hi,

 fetchData routine make an ajax request, passes along jsonDataM to the
 handler routine, at which time the responseJSON result is assigned to the
 json parameter.

Remember that it's the *value* of `jsonDataM` that gets bound to the
function, not a reference to the variable. (JavaScript is purely pass-
by-value; the value passed in the case of object references is a
reference to the object, but it's still just a value being passed.) So
if your handler function inside `fetchData` is ending up doing
something like this:

jsonData = response.responseJSON;

...that's not going to have any effect on `jsonDataM`. All you're
doing there is assigning the value of the `responseJSON` property to
your local argument variable within `fetchData`. It's exactly like
doing this:

var foo = 5;
bar(foo);
alert(foo);
function bar(f) {
   f = 6;
}

The alert will still show 5, not 6. Assigning to `f` doesn't have
any effect on `foo`.

One obvious answer is to have `fetchData` just assign directly to
`jsonDataM`, since it's a global, but I hate to offer an answer
suggesting using global variables (even if you already have them), and
I'm guessing you have a reason for making the destination for the data
an argument you give to `fetchData`.

It's easy to simulate pass-by-reference in JavaScript using object
properties. Instead of having a `jsonDataM` variable, have a variable
that's an object containing a *property* called `jsonDataM`. Pass that
object's reference to `fetchData`, and have `fetchData` write to its
`jsonDataM` property.

Applying that solution to my example above:

var obj = {
foo: 5
};
bar(obj);
alert(obj.foo);
function bar(o) {
   o.foo = 6;
}

Now it alerts 6.

If I'm completely off-base on the above, first off: Apologies. And
second off: My next guess is that the code isn't handling the fact
that the ajax request is *asynchronous*. But my first guess (since
you've titled this as a question about variable scope) is that it's
the pass-by-value thing.

HTH,
--
T.J. Crowder
Independent Software Engineer
tj / crowder software / com
www / crowder software / com

On Apr 16, 11:18 pm, kstubs kst...@gmail.com wrote:
 In the following, assuming jsonDataM is defined top of my script (so scope
 of this variable should be good):

 mapqueryform.observe('submit', fetchData.bindAsEventListener(mapqueryform,
 jsonDataM));

 fetchData routine make an ajax request, passes along jsonDataM to the
 handler routine, at which time the responseJSON result is assigned to the
 json parameter.  I'm expecting my global jsonDataM to have valid json data,
 but it is just NULL.  

 To be clear, here is the function definitions for fetchData and the handler:

 function fetchData(e, jsonData) { ... }
 function handleFetch(response, jsonData) { ... }

 and in fetchData, here is the onComplete:
 onComplete: function(response) { handleFetch(response, jsonData); }

-- 
You received this message because you are subscribed to the Google Groups 
Prototype  script.aculo.us group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com.
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en.