Как объявить переменную static/class в виджета jquery ui factory

Что касается виджета jquery ui factory...

Каков наилучший способ иметь переменную статического значения переменной/класса, которая является общей для всех экземпляров?

например.

$.widget("ui.staticTest", {
    staticVar:'unchanged',
    test: function(a){
        if(a){
            this.staticVar= a;
        }
        alert(JSON.stringify(this.staticVar));
    }
});

$('#test').staticTest();
$('#parent').staticTest();

$('#test').staticTest('test','changed');
$('#parent').staticTest('test');

в приведенном выше примере, если staticVar был static, $('# parent'). staticTest ('test'); будет предупреждать "изменено", но вместо этого он предупреждает "без изменений".

(этот код находится на jsfiddle, если вы хотите сыграть: http://jsfiddle.net/alzclarke/Sx8pJ/)

Решения, которые я могу себе представить, уродливы:

1) $('body'). data ('sharedVariable', myData) - это не похоже на хорошую практику, что, если кто-то или что-то очистит совокупность данных 2) храните его в пространстве имен прототипов, например. = $.ui.staticTest.prototype.staticVar = myData; это также вызывает сигнальные колокола

Ответ 1

Закрытие - это ваш ответ

(function($) {

var staticVariable = '';

$.widget('ui.newWidget', {
    options: {

    },
    _init: function() {
    }

});

})(jQuery);

staticVariable будет доступен только в пределах виджета, который вы только что определили, поскольку он завершен в анонимную функцию, которая вызывается немедленно (например, вы уже должны делать для своих jquery/jquery ui плагинов.

Ответ 2

Кажется, что виджеты не имеют общей области. Что бы. Итак, что бы я сделал, это определить общий объект непосредственно в объекте пользовательского интерфейса jQuery, например, вы предлагаете себя.

Примечание: имя общего объекта должно отражать имя виджета и пространство имен.

$.ui.staticShared = { color: "#fff" };

$.widget("ui.static", {
    color: function (o)
    {
        if (typeof o !== "undefined") $.ui.staticShared.color = o;

        return $.ui.staticShared.color;
    }
});

Это так же чисто, как и в моих глазах. И конечно; существует риск того, что люди будут переопределять общий объект, но это не так, как если бы мир развалился, если это произойдет.

Если вы хотите какой-либо отказоустойчивости/обратной связи, если общий объект недействителен или переопределен, вы можете выполнить проверку структуры объекта в событии _init.

$.widget("ui.static", {
    _init: function ()
    {
        if (typeof $.ui.staticShared === "undefined")
        {
            alert("$.ui.staticShared is required for this plug-in to run");
        }
    },
});

Событие _init запускается всякий раз, когда создается экземпляр.

Ответ 3

Фактически, если ваша переменная является объектом, она автоматически статична... HMMMMMMMM очень полезно! (не)... особенно учитывая, что переменные, содержащие примитивы, показывают противоположное поведение. Должно быть, это связано со старым идиомом "указатель не является объектом".

Anywho...

ЕСЛИ ВАША ПЕРЕМЕНА СОДЕРЖИТ ОБЪЕКТ {} ПОСЛЕДУЮЩИЕ БУДУТ ИСПРАВЛЕННЫМ ОТВЕТОМ, ИНЫМ, СМОТРИТЕ ДРУГИЕ ОТВЕТЫ: ​​

СТАТИЧЕСКИЙ ПРИМЕР:

$.widget("ui.staticTest", {
    staticVar:{val:'unchanged'},
    _create: function(){
    },
    test: function(a){
        if(a){
            this.staticVar.val= a;
        }
        alert(JSON.stringify(this.staticVar.val));
    }
});


$('#test').staticTest();
$('#parent').staticTest();

$('#test').staticTest('test','changed');
$('#parent').staticTest('test');

http://jsfiddle.net/alzclarke/Sx8pJ/9/

НЕСТАТИЧЕСКИЙ ПРИМЕР:

$.widget("ui.staticTest", {
    _create: function(){
      this.staticVar={val:'unchanged'};
    },
    test: function(a){
        if(a){
            this.staticVar.val= a;
        }
        alert(JSON.stringify(this.staticVar.val));
    }
});


$('#test').staticTest();
$('#parent').staticTest();

$('#test').staticTest('test','changed');
$('#parent').staticTest('test');

http://jsfiddle.net/alzclarke/Sx8pJ/10/

Ответ 4

похоже, немного недопонимание о ключевом слове "this". Здесь это ключевое слово делает эту переменную специфичной для экземпляра. Попробуйте приведенный ниже код.

$.widget("ui.staticTest", {
    staticVar:'unchanged',
    test: function(a){
        if(a){
            staticVar= a;
        }
        alert(JSON.stringify(staticVar));
    }
});

$('#test').staticTest();
$('#parent').staticTest();

$('#test').staticTest('test','changed');
$('#parent').staticTest('test');

Ответ 5

//Подробный пример, объясняющий статические, экземпляры и глобальные переменные в видимости виджета

$.widget("ui.staticTest", {
    //staticVar is an instance variable, regardless of what it is named as
    staticVar: 'brownMamba',

    _create: function() {

    },

    //test the static variable
    testStatic: function(a) {
        if (a) {
        //Here you're actually creating a new static variable called 
        //staticVar which is associated with the staticTest object as you assign 
        //value to it. 
            //Lemme show you what I mean with an example
            //Here it alerts 'Undefined' as 'staticVar' does not exists
            //don't confuse it with the staticVar: 'brownMamba' declared above, 
            //that one is an instance variable
            alert("Type of $.ui.staticTest.staticVar before assignment: " + typeof $.ui.staticTest.staticVar);

            $.ui.staticTest.staticVar = a; 
            //At this point it alerts the type of 'a', which in our case is  'string'            
            alert("Type of $.ui.staticTest.staticVar after assignment: " + typeof $.ui.staticTest.staticVar);

            //value of instance variable at this point
            alert("typeof this.staticVar: " + typeof this.staticVar);
            alert("Value of this.staticVar: " +  this.staticVar);
            //value of global variable at this point
            //'Undefined' as it does not exist
            alert("Type of staticVar: " + typeof staticVar); //or window.staticVar


        } else {
            alert("value of staticVar in testStatic with no argument: " + $.ui.staticTest.staticVar);
        }
    },

    //test the instance variable
    testInstance: function(a) {
        if (a) {
        //Here you're actually working with the instance variable declared above, 
        //with the value 'brownMamba' 
        //Lemme show you what I mean with an example
        //Here it alerts 'string' as 'staticVar' exists and is assigned a string
            alert("typeof this.staticVar is " + typeof this.staticVar + " and its 
value is " + this.staticVar);

            this.staticVar = a; 
            alert("typeof this.staticVar after assignment is " + typeof this.staticVar);
            alert("Value of this.staticVar after assignment is " + this.staticVar);
        } else {
            alert("value of this.staticVar in testInstance with no argument: " + this.staticVar);
        }
    },

    //test the Global variable
    testGlobal: function(a) {
        if (a) {
        /*Here you're actually creating a global variable called staticVar*/ 
            //Lemme show you what I mean with an example
            //Here it alerts 'Undefined' as 'staticVar' does not exists
            alert("Type of staticVar before assignment: " + typeof staticVar);

            staticVar = a; //creating a global variable, which will be declared 
in window scope, i.e. window.staticVar 
            //At this point it alerts the type of a, which in our case is a 'string'            
            alert("Type staticVar after assignment: " + typeof staticVar);
            alert("Value of staticVar after assignment: " + staticVar)
        } else {
            alert("value of staticVar in testGlobal with no argument: " + staticVar);
        }
    }
});

//instantiating widget
$('#test').staticTest();
//instantiating widget
$('#parent').staticTest();

$('#test').staticTest('testStatic', 'changed');
//value will be sustained as its associated to the object
$('#parent').staticTest('testStatic');

$('#test').staticTest('testInstance', 'bluemamba');
//here the value doesn't change as its an instance variable and its value is not altered
$('#parent').staticTest('testInstance');

$('#test').staticTest('testGlobal', 'bluemamba');
//here the value is still sustained as the global is created in the previous call
$('#parent').staticTest('testGlobal');

http://jsfiddle.net/hiteshubharani/z5k4E/6/

Ответ 6

простая имплиментация растворения петуха:

$.widget("ui.staticTest", {
test: function(a){
    if(a){
        $.ui.staticTest.staticVar= a;
    }
    alert(JSON.stringify($.ui.staticTest.staticVar));
}
});
$.ui.staticTest.staticVar =  'unchanged';


$('#test').staticTest();
$('#parent').staticTest();
$('#test').staticTest('test');
$('#test').staticTest('test','changed');
$('#parent').staticTest('test');

Ответ 7

Вы можете использовать общий шаблон инкапсуляции JS:

$.widget("ui.staticTest", (function() {

    staticVar:'unchanged';

    return {
        test: function(a){
            if(a){
                staticVar= a;
            }
            alert(JSON.stringify(staticVar));
        }
    };
} ()));

Вилка вашего jsFiddle по адресу: http://jsfiddle.net/pettys/RwKdZ/

Pro: ничего волшебного не происходит, а не возиться с пространством jQuery. Кон: отступы вашего виджета на другом уровне.