*sigh* I think I need more coffee. And a vacation. The _other_ thing I meant to mention is that I find it handy to put wrappers around the Ajax.Request (and similar) calls in Prototype. I keep meaning to write this up properly because I know the ajax stuff is being redesigned before too long, but I find that addng a "context" parameter really improves usability, and so I provide one via an adapter. (There are a few other things I do in the adapter which are more application specific.) So for me that ajax call wouldn't require a bind at all, it would look something like this:
niftyAjaxWrapperFunctionName(_location(), { method: 'get', context: this, parameters: this.getParams(), onOkay: updateComplete }); ...where updateComplete is not bound because it doesn't have to be, the wrapper triggers the onOkay function using the given context. I find that this makes my life a lot simpler. I hardly ever forget the context parameter. (And before I forgot, I went and filed an enh. req.: https://prototype.lighthouseapp.com/projects/8886-prototype/tickets/1030) -- T.J. On Apr 11, 8:30 am, "T.J. Crowder" <t...@crowdersoftware.com> wrote: > Sorry, meant to say: I also didn't see anything wrong with using a > variable to refer to `this` and not using #bind. If you do that, > though, I'd recommend using the same variable name every time you do > this, throughout all of your classes. The one I use is `self` because > lots of people seem to use it for this (no pun). (Another one you see > sometimes is `that`, but for me, that's just completely wrong [again, > no pun].) > > -- T.J. :-) > > On Apr 11, 7:20 am, "T.J. Crowder" <t...@crowdersoftware.com> wrote: > > > > > Hi, > > > Off-the-cuff, I'd probably use two binds and one local (this is > > totally off-the-cuff, and apologies if I've messed something up. Also, > > we have slightly different coding styles and while I tried to stick to > > what I inferred from what I saw, it's probably ended up a mish-mash): > > >http://pastie.org/913777 (update1.js; also pasted at the end of this > > message) > > > I *might* grab the bound updateComplete function to a local variable > > rather than re-binding it on every update, I think it may depend on my > > mood. :-) (I didn't in the above, and of course as I write this I > > think I should have.) > > > For this, I probably wouldn't use a periodical executer, either, > > because of all the state flags required. I'd probably go with chained > > execution: > > >http://pastie.org/913778 (update2.js; also pasted at end of message) > > > ...but note that that change changes the timing; 'frequency' becomes > > the time between the end of one update and the start of the next, > > rather than the time between the start of updates (barring an update > > taking longer than the time, in which case the earlier code skipped > > that update entirely). > > > *Totally* FWIW. > > > Oh, and I'm a named function guy (I notice you're using an anonymous > > function for your `autoUpdate` property); here's > > why:http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html > > > Happy coding, > > > -- T.J. :-) > > > **** update1.js: > > autoUpdate: function(was_in_progress) { > > > // TJC: One of the few situations where I find multiple > > exits maintainable; early shortcutting > > if (this.periodical_executer.updater) { > > alert('There is a request currently in progress. > > Please try again later or refresh the page.'); > > return false; // TJC: Side note, the function > > appears to return false (here) or undefined (main case) - subtle! ;-) > > } > > > var frequency = $F('page_updater_frequency'); > > this.periodical_executer.updater = new > > PeriodicalExecuter(doUpdate.bind(this), frequency); > > > // TJC: To me, breaking this out in a named function > > improves clarity > > function doUpdate() { > > if (!this.periodical_executer.request_in_progress) { > > this.params = {'authenticity_token': > > Utilities.getAuthToken(), > > 'was_in_progress': > > was_in_progress}; > > this.periodical_executer.request_in_progress = > > true; > > new Ajax.Request(_location(), { > > method: 'get', > > parameters: this.getParams(), > > onComplete: updateComplete.bind(this) > > }); > > } > > } > > > // TJC: Again, the named function (for me) immproves > > clarity > > function updateComplete(r) { > > this.periodical_executer.request_in_progress = false; > > var json = Utilities.updateElements(r); > > if (json.js_data && json.js_data.should_stop) { > > this.periodical_executer.updater.stop(); > > var effected = this.periodical_executer.glowing; > > if (effected) { > > // stop glowing effect > > effected.stopGlow(); > > } > > this.periodical_executer = {}; > > } > > else { > > // typewriter effect for updated info > > // TJC: Since it's just these IDs we need in the > > anon function below, grab them > > var tw_ids = this.type_writer_ids; > > var for_typewriter = > > json.partials.select(function(e) { return twids.include(e.id); }); > > for_typewriter.each(function(e) { > > _typeWriter(e.id); > > }) > > } > > } > > } > > > *** update2.js: > > autoUpdate: function(was_in_progress) { > > > // Short-circuit if already running > > if (this.periodical_executer.updating) { > > alert('There is a request currently in progress. > > Please try again later or refresh the page.'); > > return; > > } > > > // Setup > > this.periodical_executer.updating true; > > var frequency = $F('page_updater_frequency'); > > var updateComplete = updateCompleteImpl.bind(this); > > var doUpdate = doUpdateImpl.bind(this); > > > // Kick off the process > > doUpdate(); // Or: doUpdate.delay(frequency); > > > // Process an update > > function doUpdateImpl() { > > this.params = {'authenticity_token': > > Utilities.getAuthToken(), > > 'was_in_progress': was_in_progress}; > > new Ajax.Request(_location(), { > > method: 'get', > > parameters: this.getParams(), > > onComplete: updateComplete > > }); > > } > > > // Process update completion > > function updateCompleteImpl(r) { > > var json = Utilities.updateElements(r); > > if (json.js_data && json.js_data.should_stop) { > > var effected = this.periodical_executer.glowing; > > if (effected) { > > // stop glowing effect > > effected.stopGlow(); > > } > > this.periodical_executer = {}; > > } > > else { > > // typewriter effect for updated info > > var tw_ids = this.type_writer_ids; > > var for_typewriter = > > json.partials.select(function(e) { return twids.include(e.id); }); > > for_typewriter.each(function(e) { > > _typeWriter(e.id); > > }) > > > // Kick off next update > > doUpdate.delay(frequency); > > } > > } > > } > > > On Apr 11, 5:28 am, patrick <patrick99...@gmail.com> wrote: > > > > Hi, > > > > This is one of my more 'complicated' methods that just seem like > > > using .bind(this) at the end of the inner functions would make the > > > code read more confusing.. I believe I have some other methods > > > somewhere that actually pass functions as params inside those > > > beforeCreate, afterFinish blocks, and they too would require .bind -- > > > and at the point it just gets really ugly... > > > > autoUpdate: function(was_in_progress) { > > > var frequency = $F('page_updater_frequency'); > > > var admin_table = this; > > > > if (!this.periodical_executer.updater) { > > > admin_table.periodical_executer.updater = > > > new > > > PeriodicalExecuter(function() { > > > if > > > (!admin_table.periodical_executer.request_in_progress) { > > > admin_table.params = > > > {'authenticity_token': > > > Utilities.getAuthToken(), > > > > > > 'was_in_progress': was_in_progress}; > > > > new > > > Ajax.Request(_location(), { > > > method: 'get', > > > parameters: > > > admin_table.getParams(), > > > onCreate: > > > function() { > > > > > > admin_table.periodical_executer.request_in_progress = true; > > > }, > > > onComplete: > > > function(r) { > > > > > > admin_table.periodical_executer.request_in_progress = false; > > > var json > > > = Utilities.updateElements(r); > > > ... > > read more » -- 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-scriptacul...@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.