Ah, ok, now I get it. Then yea, that works, and is a very fine way to do it
(to answer the "is this a well known way")...
Another way could be to pass the instance into the callback function as an
argument. So then you'd define the callback as such...
var dialog = new Dialog("test.php", { beforeLoad: function(dlg) { alert(
dlg.dialog_id); return null; } });
On 4/9/07, David Dashifen Kees <[EMAIL PROTECTED]> wrote:
>
> Right, but the function is defined outside of the scope of the dialog ...
> usually in an anonymous function within a window.onload observer. I pass
> an object containing those anonymous functions to the intialize() method of
> the dialog class and then copy them over into the class itself. That way, a
> page can have more than one dialog which respond to their own set of event
> handlers.
>
> I have found out that specifying the context of the function using the
> call() method of the JavaScript Function object seems to work, but I'm not
> sure this is a well known feature of Javascript actions. For example,
> here's a dialog with an anonymous beforeLoad function. I can't bind() it
> here because this refers to the local scope and I can't bind it to "dialog"
> since it's not actually initialized until after the
> Dialog.prototype.initialize() function completes...
>
> var dialog = new Dialog("test.php", { beforeLoad: function() { alert(
> this.dialog_id); return null; } });
>
> But, if I add the following to line #46 in the pastie from my original
> post, things work:
>
> this.json = this.responders["beforeLoad"].call(this);
>
> Everything is happy. I found out about the call method of Functions in
> JavaScript only after I posted my message above. I wonder if this is common
> practice? Also, I notice that it is used in the prototype.js code, so
> maybe this is the best way to do it?
>
> -- Dash --
>
>
>
>
>
> Ryan Gahl wrote:
>
> You can attach .bind(this) to anonymous functions...
>
> beforeOnload: function() {....stuff....}.bind(this)
>
> On 4/9/07, David Dashifen Kees <[EMAIL PROTECTED]> <[EMAIL PROTECTED]> wrote:
>
> Greetings all,
>
> I've written an object to create a lightbox-like dialog on-screen (I
> posted about it earlier; search for "dialogish" within the group and you'll
> find that thread). I then ran into the Control.Modal window which did
> much of what I wanted, but was also much more complex. I didn't understand
> all of what the developer of Control.Modal was doing so I tried to take
> what I did understand from his class and apply it to mine. If you're
> unfamiliar with Control.Modal, you can find it here:
> http://livepipe.net/projects/control_modal/.
>
> The problem I'm facing as that the functions that are called to respond to
> different dialog-centric events (like beforeLoad, beforeOpen, etc.) have a
> scope that's not that of the dialog object. Code time:
>
> var dialog = new Dialog("test.php", {
> beforeLoad: function() { return { window_id: $F("window_id") } }
> }); dialog.activate();
>
> The above snippet shows the basics of how the dialog object is started.
> You pass the URL of the information to be loaded
> via Ajax.Updater as well as any custom functions which need to respond to
> one of four different events within the dialog code: before the information
> is loaded, before the content is shown, before the content is hidden, and
> before the dialog container is actually removed from the DOM. The above
> snippet would work fine, but I can imagine a time when I might want to do
> something like this:
>
> var dialog = new Dialog("test.php", {
> beforeClose: function() {
> $(this.dialog_id).getElementsByTagName("input").each(function(input)
> { /* ... */ })
> }
> }); dialog.activate();
>
> The above snippet doesn't work, clearly because the this keyword refers
> to the scope of the anonymous function, unless I misunderstand something
> crucial. So, I tried to do something like this:
>
> Dialog.prototype = {
> initialize: function(href, custom_responders) {
> /* ... do other setup stuff ... */
>
> if(custom_responders)
> for(responder in custom_responders)
> this.responders[responder] = custom_responder[responder];
>
> *for(responder in this.responders) this.responders
> [responder].bind(this)*
>
> I thought that the above use of the bind() function would tell the the
> responder functions which are passed within the custom_responders object to
> use the scope of the dialog object as their scope but that doesn't seem to
> be the case. Simply uses of this binding like the following still fail:
>
> var dialog = new Dialog("test.php", { beforeLoad: function() { alert(
> this.dialog_id) } });
>
> For what it's worth, it alerts undefined. Here's the code:
> http://pastie.caboo.se/52614
>
> Note that the usage of bind() mentioned in this post is not in the
> pastie. My bad.
>
> -- Dash --
>
>
>
>
>
>
>
>
> >
>
--
Ryan Gahl
Application Development Consultant
Athena Group, Inc.
Inquire: 1-920-955-1457
Blog: http://www.someElement.com
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Spinoffs" 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/rubyonrails-spinoffs?hl=en
-~----------~----~----~----~------~----~------~--~---