Skip to main content

this.function is not a function error, but function exists



I have some code to get calendar events and display them. The display is only updated if the events have changed, since the last call.







var calendar = {



events = null,



display_calendar_events : function (data) {

// Some display stuff...

},



get_events: function() {



// Get messages for calendar

$.getJSON("/ajax/get-events/", function(json){



var new_events = json.data;

// If events haven't changed, do nothing

if (this.events === new_events) {

return true;

}



// Events have changed.

// Save new events

this.events = new_events;



// Display new events

this.display_calendar_events(json);

});

},

}







I call this with:







calendar.get_queued_events();







The problem is, I'm getting the error "this.display_calendar_events is not a function" (last line of code). But if I change this line to:







calendar.display_canendar_events(josn)







it works. The storing of the old events with "this.events" works fine in both cases.





Can someone explain this to me? How can "this" work for some stuff and not others? Thanks.


Comments

  1. In a jQuery AJAX callback, this references the ajax request object. Try using var self = this; before your AJAX call, and in the callback use self.display_calendar_events().

    Alternatively, you could just reference calendar.display_calendar_events() directly. But that's not easily refactored like the self method is.

    ReplyDelete
  2. When you call this.display_calendar_events() inside the ajax request you area ctually in a different context than your object. You have to do:

    var calendar = {

    events = null,

    display_calendar_events : function (data) {
    // Some display stuff...
    },

    get_events: function() {
    var $this = this;
    // Get messages for calendar
    $.getJSON("/ajax/get-events/", function(json){

    var new_events = json.data;
    // If events haven't changed, do nothing
    if ($this.events === new_events) {
    return true;
    }

    // Events have changed.
    // Save new events
    $this.events = new_events;

    // Display new events
    $this.display_calendar_events(json);
    });

    },

    }

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.