вызов функции с этим ключевым словом не определен

0

Я вызываю функцию local (class) через this указатель, но получаю сообщение об ошибке 'Uncaught TypeError: undefined is not a function'. Probem происходит в строке this.createtimetable(); при loadtimetable функции.

Мой JS (актуальный):

this.createtimetable = function () {
    this.inside_timetable = [];
    for (var d = new Date(in_week_start); d <= new Date(in_week_end); d.setDate(d.getDate() + 1)) {
        console.log(new Date(d));
        daysOfYear.push(new Date(d));
    }
}

this.loadtimetable = function (in_guide_id, in_week_start, in_week_end) {
    this.guide_id = in_guide_id;
    this.week_start = in_week_start;
    this.week_end = in_week_end;
    $.post("./j.php", {
        guide_id : in_guide_id,
        week_start : in_week_start,
        week_end : in_week_end
    })
    .done(function (data) {

        var res_arr = jQuery.parseJSON(data);

        if (res_arr.code == 0) {
            this.excursions_base = res_arr.answer;
            alertify.success("Data extracted");
            this.createtimetable();
        } else {
            alertify.error("Some problem occured." + data);
        }
    }).fail(function () {
        alertify.alert("Error. Please, refresh page, or try later. We are sorry. Write or call us with your question!");
    });
}

Вызов по имени (т.е. Createtimetable()) также терпит неудачу. Спасибо за идеи!

  • 0
    this указывает на контекст, поэтому будьте осторожны с тем, кто и как вызывает ваши функции
Теги:

2 ответа

2
Лучший ответ

Храните ссылку в $(this) вне функции post-функции и используйте ее в done функции обратного вызова, здесь this не относится к вашему объекту.

this.loadtimetable = function(in_guide_id, in_week_start, in_week_end)
{  
    var self = this; //store reference of this
    $.post( "./j.php", {})
      .done(function( data ) {
        self.createtimetable(); //Here instead of this use your variable
    });
}

РЕДАКТИРОВАТЬ

Если вы открыты для использования $.ajax() вместо $.post(). Вы можете использовать параметр контекста.

Этот объект станет контекстом всех обратных вызовов, связанных с Ajax. По умолчанию контекст представляет собой объект, который представляет параметры ajax, используемые в вызове ($.ajaxSettings объединенные с параметрами, переданными в $.ajax). (...)

$.ajax({
    context: this
});
  • 0
    О, моя глупая ошибка! Спасибо!
3

Ваш код выполняется в обратном вызове, и this больше не указывает на ваш объект. Вы должны либо использовать замыкание, накладывая this на что-то вроде self, либо явно связывая это

this.createtimetable = function () {
    this.inside_timetable = [];
    for (var d = new Date(in_week_start); d <= new Date(in_week_end); d.setDate(d.getDate() + 1)) {
        console.log(new Date(d));
        daysOfYear.push(new Date(d));
    }
}
this.loadtimetable = function (in_guide_id, in_week_start, in_week_end) {
    this.guide_id = in_guide_id;
    this.week_start = in_week_start;
    this.week_end = in_week_end;
    $.post("./j.php", {
        guide_id: in_guide_id,
        week_start: in_week_start,
        week_end: in_week_end
    })
    .done(function (data) {
        var res_arr = jQuery.parseJSON(data);
        if (res_arr.code == 0) {
            this.excursions_base = res_arr.answer;
            alertify.success("Data extracted");
            this.createtimetable();
        } else {
            alertify.error("Some problem occured." + data);
        }
    }.bind(this)).fail(function () {
        alertify.alert("Error. Please, refresh page, or try later. We are sorry. Write or call us with your question!");
    }.bind(this));
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню