Частные свойства jQuery UI Widget Factory

Я работаю над виджетом пользовательского интерфейса jQuery, но столкнулся с некоторыми проблемами. Вот как я создаю плагин.

$('#myId0, #myId1').mywidgetname();

И вот мой код плагина:

;(function ( $, window, document, undefined ) {
  $.widget( "namespace.mywidgetname" , {
    _create: function(){
      debugger;
      this._myPrivateProperty = 2;
....

Проблема в том, что когда отладчик останавливается во второй раз, у меня уже есть экземпляр this._myPrivateProperty со значением 2. Я думал, что экземпляр виджета будет создан дважды, но это не так.

Кроме того, если я укажу разные параметры для каждого элемента, например:

$('#myId0').mywidgetname({myVarA: 'someText'});
$('#myId1').mywidgetname({myVarB: 'someText'});

Переменная this.options будет разной для каждого из них. Кто-нибудь знает, как сделать «частные» свойства частными?

Спасибо


person Community    schedule 20.04.2014    source источник


Ответы (1)


Я нашел проблему. Кажется, что не следует определять свойства в корне вашего плагина следующим образом:

;(function ( $, window, document, undefined ) {
  $.widget( "namespace.mywidgetname" , {
    myPrivateVar = {},
    _create: function(){

      this.myPrivateVar.test = 2;
....

Это сохраняет ссылку для всех экземпляров. Но вместо этого вы должны объявлять свои переменные прямо внутри метода _create.

;(function ( $, window, document, undefined ) {
  $.widget( "namespace.mywidgetname" , {
    _create: function(){
      this.myPrivateVar = {};
      this.myPrivateVar.test = 2;
....
person Community    schedule 20.04.2014
comment
Примечательно, что в документации об этом не упоминается. - person Antti29; 29.10.2014
comment
Это имеет смысл, поскольку $.widget( "namespace.mywidgetname", ..) становится классом. И если мы определим новое свойство - оно будет доступно для всех экземпляров - person Chintsu; 26.05.2016