2012-02-29 3 views
0

У меня есть виджет jQuery UI, который прикрепляется к div, а затем прослушивает определенные элементы управления внутри него (задается через опции). Проблема в том, что в моем прослушивателе событий это относится к элементу управления, который был изменен, а не к элементу, к которому привязан виджет. Итак, как я могу получить доступ к элементу виджетов?JQuery UI и обработка событий

_addressChanged: function() { 
     $(this).data("address").requiresValidation = true; 
    }, 

    _bindEventHandlers: function() { 
     $(this.options.address1).bind("change", this._addressChanged); 
     $(this.options.address2).bind("change", this._addressChanged); 
     $(this.options.city).bind("change", this._addressChanged); 
     $(this.options.zip).bind("change", this._addressChanged); 
    }, 

ответ

0

Вы пытались this.element?

От http://wiki.jqueryui.com/w/page/12138135/Widget%20factory:

this.element

Элемент, который был использован для создания экземпляра модуля. Например, если вы должны были сделать $("#foo").myWidget(), то внутри вашего экземпляра виджета this.element будет объектом jQuery, содержащим элемент с id foo. Если вы выберете несколько элементов и вызовите .myWidget() в коллекции, для каждого элемента будет создан экземпляр отдельного экземпляра. Другими словами, this.element всегда будет содержать только один элемент.

+0

Это не будет работать в обработчике событий, который был связан через .bind() или on(). См. Мой ответ на решение, предлагаемое фабрикой виджета. –

1

Используйте привязку обработчика this._on() method. Этот метод предоставляется фабрикой виджета jQuery UI и гарантирует, что внутри функции обработчика this всегда ссылается на экземпляр виджета.

_bindEventHandlers: function() { 
    this._on(this.options.address1, { 
     change: "_addressChanged" // Note: pass the function name as a string! 
    }); 
    ... 
}, 
_addressChanged: function (event) { 
    // 'this' is now the widget instance. 
    // 'this.element', as suggested by sjsharktank, is the DOM element the widget was created on 
},