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
-~----------~----~----~----~------~----~------~--~---

Reply via email to