Виджет 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
,