comment déclarer une statique/variable de classe dans un jquery ui widget widget factory
Concernant le jquery ui widget factory...
Quel est le meilleur moyen d'avoir une variable statique/le niveau de la classe de la variable qui est partagée entre toutes les instances?
par exemple
$.widget("l'interface utilisateur.staticTest", { staticVar:'inchangées", test: function(a){ si(un){ c'.staticVar= a; } alert(JSON.stringify(ce.staticVar)); } }); $('#test').staticTest(); $('#parent").staticTest(); $('#test').staticTest('test','changé'); $('#parent").staticTest('test');
ci-dessus, si staticVar étaient statiques, $('#parent").staticTest('test'); alert 'changé', mais au lieu de cela il alertes "sans changement".
(ce code est sur jsfiddle si vous voulez avoir un jeu: http://jsfiddle.net/alzclarke/Sx8pJ/)
Les solutions que je peux penser de moi-même sont moches:
1) $('body').de données('sharedVariable', myData) - cela ne semble pas être une bonne pratique, que si quelqu'un ou quelque chose efface le corps de données
2) les stocker dans le prototype de l'espace de noms par exemple = $.l'interface utilisateur.staticTest.le prototype.staticVar = myData;
cela a aussi des anneaux de sonnettes d'alarme
OriginalL'auteur alzclarke | 2011-03-30
Vous devez vous connecter pour publier un commentaire.
Fermetures est votre réponse
staticVariable ne sera disponible que dans le cadre de la fenêtre, vous venez de définir, car il est enveloppé dans une fonction anonyme qui est appelé immédiatement (comme vous devez déjà être en train de faire pour votre jquery/jquery ui plugins.
Puis-je demander comment on aurait accès (set) staticVariable de l'extérieur de la widget? J'ai besoin d'une option qui est configurable, une fois pour toutes widget instances.
vous pourriez faire une fonction pour le faire et de le rendre étendue globale
OriginalL'auteur Eric Pigeon
Semble que les widgets ont pas la même portée. Que ce soit. Donc, ce que je voudrais faire est de définir un objet partagé sur le jQuery UI objet lui-même, comme vous proposez vous-même.
Remarque: le nom d'objet partagé doit refléter le nom du widget et l'espace de noms.
C'est aussi propre qu'il l'obtient dans mes yeux. Et bien sûr, il y a un risque de substitution de l'objet partagé, mais c'est pas comme si le monde va s'écrouler si cela arrive.
Si vous voulez une sorte de fail-safe/commentaires sur si l'objet partagé est pas valide ou a été remplacé, vous pouvez faire une vérification sur la structure de l'objet sur la
_init
événement.La
_init
événement est déclenché lorsqu'une instance est créée.Vous avez raison. _Static est défini sur l'objet window. Bien repéré 🙂
Mise à jour de ma réponse.
mieux que ce que j'ai proposé je pense... : >
OriginalL'auteur cllpse
en fait, si votre variable est un objet, il est automatiquement statique... HMMMMMMMM très utile! (ne pas)... surtout en considérant que les variables contenant les primitives de montrer le contraire du comportement. Doit être quelque chose à voir avec la vieille "le pointeur n'est pas l'objet de" l'idiome.
ANYWHO...
SI LA VARIABLE CONTIENT UN OBJET {} LA SUIVANTE SERA LA BONNE RÉPONSE, SINON, DE VOIR LES AUTRES RÉPONSES:
STATIQUE EXEMPLE:
http://jsfiddle.net/alzclarke/Sx8pJ/9/
NON STATIQUE EXEMPLE:
http://jsfiddle.net/alzclarke/Sx8pJ/10/
hé oui, sauf si cela porte atteinte à l'encapsulation, dans ce cas, votre autre option est de déclarer la variable d'objet dans la _create ou _init méthodes.
Les variables statiques sont souvent des constantes, qui par convention aurait ALL_CAPS noms. Il est ironique de constater que la seule ALL_CAPS que je vois sur cette page sont dans ce shouty réponse.
OriginalL'auteur alzclarke
il semble que, peu de malentendu sur le mot clé "this". Ici, ce mot-clé faire que la variable d'instance spécifique. Essayez le code ci-dessous.
désolé, vous avez raison! Bien pensé, en fait le code est de la déclaration et l'affectation d'une variable globale pas une variable de classe. si j'exécute votre code avec la ligne d'alerte(staticVar); à la fin, elle alerte également "changés". de même, si le code avant de l'appeler utilise le nom de cette variable la valeur est perdue.
OriginalL'auteur JS Mitrah
simple implémentation de chant du coq soludion:
OriginalL'auteur alzclarke
//Exemple détaillé expliquant statique, instance et des variables globales dans le widget portée
http://jsfiddle.net/hiteshubharani/z5k4E/6/
alzclarke, j'aurais apprécié que vous en ajoutant votre propre réponse au lieu de complètement modifier mon post.
assez juste, je suis revenue de mon montage et l'ajout d'une nouvelle réponse, soz, je ne voulais pas offenser!
Votre revenue post n'était pas proche de l'original post de la mine. Mais, j'apprécie le fait que vous avez au moins essayé, et de la création de votre propre poste. Merci.
j'ai simplement utilisé l'histoire menu pour revenir à l'état précédent et donc ne suis pas sûr de ce qui n'allait pas... pouvez-vous le corriger?
OriginalL'auteur
Vous pouvez utiliser le général JS encapsulation modèle:
Fourche de votre jsFiddle: http://jsfiddle.net/pettys/RwKdZ/
Pro: rien de magique se passe, de ne pas jouer avec jQuery l'espace à tous.
Con: tirets votre widget à un autre niveau.
OriginalL'auteur pettys