Thanks a lot! It's working perfectly now! -Andy
-------------------------------------------------- From: "Daniel Rubin" <dru...@dimedis.de> Sent: Wednesday, August 26, 2009 3:01 AM To: <prototype-scriptaculous@googlegroups.com> Subject: [Proto-Scripty] Re: this keyword inside of the map function > > Andy Daykin wrote: >> The way that my script is working on that page http://andydaykin.com/Home >> (http://andydaykin.com/Home/public/js/Home.js is the link to the >> javascript >> file) is how I want it to work, but I want to make my script fit the >> prototype conventions a little bit more. >> >> So if I try and make instance variables, the doSlide function can't see >> them. As I stated before the scope of this inside of the map function is >> what is causing the problem I believe. The click handler (doSlide) won't >> recognize an instance variable. >> >> For instance if I say this.varName in my init function, and try and >> access >> this.varName in the doSlide function, the variable won't be recognized. >> >> To solve this I am using "var varName" outside of the class, but I would >> like to do this the "proper" way. >> >> -Andy > Alright, I'll just post how I believe it should work. > > //============================================================ > initialize: function (parentDiv, featuresWrapper) { > var features = $(featuresWrapper).descendants (); > $(parentDiv).descendants ().map (function (e, i) { > $(e).observe ('click', > this.doSlide.bind (this, features[i].id)); > }, this); > > slides = $$('.featureImage').map (function (e) { > return e.id; > }); > }, > //============================================================ > > 1) I threw out the dom:loaded-handling stuff: The particular SlideShow > object should be created in such a handler, of course, but listening > for the event in the constructor would limit the class' use to this > application only. > Instead, put > var mySlide = new SlideShow ('featureList', 'featuresWrapper'); > in your global dom:loaded handler in the main HTML file. (But make > sure to load Home.js first.) > > 2) The featuresWrapper Element is passed as constructor arg now, too. > No point in hard-coding it, I think. > > 3) Note "this" as the second parameter to the map-call. That's the > "context"-param T. J. pointed out. By passing "this", we ensure > that "this" is the same inside and outside the mapping-function. > > 4) The mapping-function takes a second parameter "i", which is just > the old counter "i", but readily provided by the map-iteration. > > I hope this works -- I have not tested it myself. > > Have fun > ----Daniel > > > >> -------------------------------------------------- >> From: "Daniel Rubin" <dru...@dimedis.de> >> Sent: Tuesday, August 25, 2009 3:06 AM >> To: <prototype-scriptaculous@googlegroups.com> >> Subject: [Proto-Scripty] Re: this keyword inside of the map function >> >>> Andy Daykin wrote: >>>> The doSlide function was what I was referring to. I tried using TJ's >>>> suggestion of using this as the 2nd parameter, but the handler still >>>> wasn't >>>> getting called. You can find a prototype of what I am doing at >>>> http://andydaykin.com/Home. The slideshow (images obviously missing) is >>>> on >>>> the main page. The javascript file for the class is >>>> http://andydaykin.com/Home/public/js/Home.js >>> Could you please provide the current state once more? Perhaps stripped >>> down to the vital parts of HTML and scripts? I think we need to have a >>> look at the details here. >>> >>> ----Daniel >>> >>> >>> >>>> -------------------------------------------------- >>>> From: "Daniel Rubin" <dru...@dimedis.de> >>>> Sent: Friday, August 21, 2009 3:38 AM >>>> To: <prototype-scriptaculous@googlegroups.com> >>>> Subject: [Proto-Scripty] Re: this keyword inside of the map function >>>> >>>>> Andy Daykin wrote: >>>>>> I tried the first suggestion, but the function still isn't getting >>>>>> called. >>>>> Exactly which function do you refer to? The map-iterator-func >>>>> ("function >>>>> (e) { ... }") or the click-handler (this.doSlide)? >>>>> >>>>> ----Daniel >>>>> >>>>> >>>>> >>>>>> TJ, can you explain more, or show an example of what the context >>>>>> param >>>>>> would >>>>>> look like? Should I just put the doSlide function as the 2nd >>>>>> parameter? >>>>>> >>>>>> -Andy >>>>>> >>>>>> -------------------------------------------------- >>>>>> From: "T.J. Crowder" <t...@crowdersoftware.com> >>>>>> Sent: Thursday, August 20, 2009 3:56 AM >>>>>> To: "Prototype & script.aculo.us" >>>>>> <prototype-scriptaculous@googlegroups.com> >>>>>> Subject: [Proto-Scripty] Re: this keyword inside of the map function >>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> Rather than binding it, use the second parameter to map (aka collect >>>>>>> [1]), that's what the second param ("context") is for. You'll find >>>>>>> that most of the Enumerable methods that take callbacks also take a >>>>>>> context parameter so the callback can be a method. >>>>>>> >>>>>>> [1] http://prototypejs.org/api/enumerable/collect >>>>>>> >>>>>>> HTH, >>>>>>> -- >>>>>>> T.J. Crowder >>>>>>> tj / crowder software / com >>>>>>> Independent Software Engineer, consulting services available >>>>>>> >>>>>>> >>>>>>> On Aug 20, 8:34 am, Daniel Rubin <dru...@dimedis.de> wrote: >>>>>>>> Andy Daykin wrote: >>>>>>>>> Hello, I am having some difficulties writing a class, in my code I >>>>>>>>> have >>>>>>>>> a class where I need to be able to bind event listeners to values. >>>>>>>>> In >>>>>>>>> my code I want the variable pointerIndex to be accessible outside >>>>>>>>> of >>>>>>>>> the initialize function, but right now it is not. If I make a >>>>>>>>> global >>>>>>>>> variable for pointerIndex I can solve the problem, but I would >>>>>>>>> rather >>>>>>>>> have a class variable using the this keyword. >>>>>>>>> I am not positive, but I believe the problem is from my event >>>>>>>>> listeners >>>>>>>>> on the line: >>>>>>>>> Now: $(e).observe('click', >>>>>>>>> this.doSlide.bind(featuresWrapper[i].id)); >>>>>>>>> Before: (working) $(e).observe('click', >>>>>>>>> mySlide.doSlide.curry(featuresWrapper[i].id)); >>>>>>>>> With the new way of calling the doSlide function I can't even seem >>>>>>>>> to >>>>>>>>> be able to call the function, nothing happens when the function >>>>>>>>> should >>>>>>>>> get called. Before I was using the curry function to try and pass >>>>>>>>> the >>>>>>>>> values of the featuresWrapper array to the doSlide function. I was >>>>>>>>> able >>>>>>>>> to get that to work, but I would rather just use bind and this to >>>>>>>>> make >>>>>>>>> the code more object oriented. Based on my alert statements I can >>>>>>>>> tell >>>>>>>>> that the this keyword is different inside and outside of the map >>>>>>>>> function. >>>>>>>> Hi Andy, >>>>>>>> >>>>>>>> the last observation is crucial. Because this is not your expected >>>>>>>> SlideShow instance when you do this.doSlide.bind (...), >>>>>>>> this.doSlide >>>>>>>> is >>>>>>>> undefined and thus the call to this.doSlide.bind fails (there >>>>>>>> should >>>>>>>> be >>>>>>>> an exception in the error console somewhere). >>>>>>>> >>>>>>>> You can solve it by bind()-ing the map function, too: >>>>>>>> $(parentDiv).childElements().map( (function(e) { >>>>>>>> $(e).observe('click', >>>>>>>> this.doSlide.bind(this, featuresWrapper[i].id)); >>>>>>>> }).bind (this) ); >>>>>>>> >>>>>>>> (Note: Passing this as first arg to the inner bind call, as Kevin >>>>>>>> suggested, is needed, too.) >>>>>>>> >>>>>>>> Have fun >>>>>>>> ----Daniel >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> var SlideShow = Class.create({ >>>>>>>>> initialize: function(parentDiv) { >>>>>>>>> this.pointerIndex = 0; >>>>>>>>> //pointerIndex = 0; >>>>>>>>> // Load the event listener for each section >>>>>>>>> document.observe("dom:loaded", function() { >>>>>>>>> var featuresWrapper = $('featuresWrapper').childElements(); >>>>>>>>> var i = 0; >>>>>>>>> alert(this); >>>>>>>>> $(parentDiv).childElements().map(function(e) { >>>>>>>>> alert(this); >>>>>>>>> $(e).observe('click', this.doSlide.bind(featuresWrapper[i].id)); >>>>>>>>> //$(e).observe('click', >>>>>>>>> mySlide.doSlide.curry(featuresWrapper[i].id)); >>>>>>>>> i++; >>>>>>>>> }); >>>>>>>>> slides = $$('.featureImage').map(function(e) { >>>>>>>>> return e.id; >>>>>>>>> }); >>>>>>>>> }); >>>>>>>>> }, >>>>>>>>> doSlide: function(slideClicked) { >>>>>>>>> alert('here'); >>>>>>>>> if(active == 0) { >>>>>>>>> active = 1; >>>>>>>>> var yValCurrent = >>>>>>>>> $(slides[this.pointerIndex]).viewportOffset().top; >>>>>>>>> //var yValCurrent = $(slides[pointerIndex]).viewportOffset().top; >>>>>>>>> var yValClick = $(slideClicked).viewportOffset().top; >>>>>>>>> var yValDiff = yValClick - yValCurrent; >>>>>>>>> var pointerShift = 0; >>>>>>>>> if (Math.abs(yValDiff) == Math.abs(210)) { >>>>>>>>> pointerShift = 70; // Change this to get the height as well as a >>>>>>>>> few >>>>>>>>> more >>>>>>>>> } >>>>>>>>> else { >>>>>>>>> pointerShift = 140; >>>>>>>>> } >>>>>>>>> if (yValDiff > 0) { >>>>>>>>> $$('.featureImage').map(function(e) { >>>>>>>>> new Effect.Move(e, { y: -yValDiff, duration: .8, afterFinish: >>>>>>>>> function(e) { active = 0; } }); >>>>>>>>> }); >>>>>>>>> new Effect.Move('featurePointer', { y: pointerShift }); >>>>>>>>> } >>>>>>>>> else if (yValDiff < 0) { >>>>>>>>> $$('.featureImage').map(function(e) { >>>>>>>>> new Effect.Move(e, { y: -yValDiff, duration: .8, afterFinish: >>>>>>>>> function(e) { active = 0; } }); >>>>>>>>> }); >>>>>>>>> new Effect.Move('featurePointer', { y: -pointerShift }); >>>>>>>>> } >>>>>>>>> this.pointerIndex = slides.indexOf(slideClicked); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> }); >>>>>>>>> var slides; >>>>>>>>> var active = 0; >>>>>>>>> //var pointerIndex = 0; >>>>>>>>> var mySlide = new SlideShow('featureList'); > > > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---