Виджет JQuery: настройка контекста в подвиджете

У меня есть виджет, который в основном создает указатель даты JQuery для элемента, а затем обрабатывает извлечение данных из веб-службы и включение / отключение дат на основе возвращенных данных.

Виджет определяется следующим образом: несколько простых параметров по умолчанию:

$.widget("XXXX.CalendarBooking", {
    options: {
    minDaysInAdvance: 0,
    maxDaysInAdvance: 0,
    productNumber: '',
    url: '',
    numberOfDays: 40
},
...

Конструктор выглядит следующим образом: он создает указатель даты для элемента, а затем настраивает функции для извлечения данных и обработки (включения) дат:

_create: function () {
    this.element.datepicker({
        dateFormat: 'dd MM yy',
        firstDay: 1,
        minDate: this.options.minDaysInAdvance,
        maxDate: this.options.maxDaysInAdvance,
        beforeShowDay: this._processDate,
        onChangeMonthYear: this._changeMonthYear
    });
    ...

Функция processdate выглядит так:

_processDate: function (date) {
    // get availability
    if (!this._availability) {
    $.ajax({
        async: false,
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: this.options.url,
        data: '{ productNumber: "' + this.options.productNumber + '", startDate: "' + date.toJSON() + '", numberOfDays: ' + numberOfDays + ' }',
        dataType: "json",
        success: function (msg) {
            _setAvailability(msg.d);
        },
        error: function (xhr, ajaxOptions, thrownError) {
            _setAvailability('error');
        }
    });
}

Однако когда вызывается processdate, контекст не попадает в виджет, поэтому у меня нет доступа к параметрам. Правильно ли я это делаю, или есть способ перегрузить функцию processdate, чтобы при установке обратного вызова для beforeShowDay я мог передавать параметры, и он не перезаписывал значение даты, которое JQuery передаст этой функции?

1 ответ

Решение

Ты можешь использовать $.proxy установить контекст, в котором должна вызываться функция. попробуй это:

beforeShowDay: $.proxy(this._processDate, this),

Теперь в вашем _processDate функционировать this Ключевое слово будет ссылаться на ваш виджет. Вы можете получить доступ к элементу, на котором было возбуждено событие, используя this.element,

Другие вопросы по тегам