Hi,

I haven't been into the details of your specific situation, I just
happened to notice the suggestion to bind when using map and it jumped
out at me.  But generally:

Say `this` points to an instance that has a flurgle property with the
value "bar".  And so:

alert(this.flurgle);

...alerts "bar".

Within the map function, unless you specify context, `this` won't
refer to the instance anymore:

[1, 2].map(function(item) {
    alert(this.flurgle + ": " + item);
});

...alerts "undefined: 1" and "undefined: 2" because `this` inside the
map function doesn't have the same value as `this` outside of it.  But
map allows you to pass a second parameter specifying what `this`
should be inside the function:

[1, 2].map(function(item) {
    alert(this.flurgle + ": " + item);
}, this);

...and so that alerts "bar: 1" and "bar: 2" as expected.  Many of the
Enumerable methods have this optional second context parameter.

HTH,
--
T.J. Crowder
tj / crowder software / com
Independent Software Engineer, consulting services available


On Aug 21, 12:45 am, "Andy Daykin" <daykina...@gmail.com> wrote:
> I tried the first suggestion, but the function still isn't getting called.
>
> 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