Partage des parameters entre les méthodes du plug-in jQuery à espace de noms

J’écris un plugin et suis conforme à la pratique recommandée par la documentation jQuery http://docs.jquery.com/Plugins/Authoring en ce qui concerne le traitement de noms et les méthodes multiples.

Mon init () prend en charge la fusion des parameters par défaut et personnalisés à l’aide de $ .extend (), mais je ne vois pas comment rendre ces options disponibles en dehors de la méthode init (). Dites cet appel et initialisez mon plugin en utilisant

$("a").myplugin({debug:false}); 

comment puis-je référencer la propriété de débogage plus tard quand j’appelle

 $("a").myplugin("someMethod")? 

Un exemple approximatif est:

  (function( $ ){ var methods = { init: function(customSettings) { var options = { debug: true } return this.each(function () { if (customSettings) { $.extend(options, customSettings); } }); }, someMethod: function() { if(options.debug) { // <-- How can I access options here? // do something } } } })( jQuery ); $.fn.myplugin = function (method) { if (methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if (typeof method === 'object' || !method) { return methods.init.apply(this, arguments); } else { $.error('Method ' + method + ' does not exist on jQuery.tbwaga'); } }; 

Je n’ai pas regardé votre modèle de plug-in, mais je voulais partager ce formatage pour le plug-in jQuery … cela ajoute une référence inverse à l’object DOM dans les données stockées de jQuery. Cela facilite l’access aux fonctions et / ou aux variables du plug-in, même à partir de l’extérieur de la fermeture du plug-in.

Voici un article décrivant plus en détail la structure du plugin.

Donc, pour accéder à une fonction dans le plugin, vous utilisez simplement l’object de données:

 $('a').data('myplugin').function_name(); 

ou même obtenir une variable à partir des parameters du plugin

 var height = $('a').data('myplugin').options.height; 

Mais pour répondre à votre question, pour que vos options soient disponibles pour d’autres fonctions à l’intérieur de la fermeture, définissez simplement la variable d’option en dehors de la fonction init:

 (function( $ ){ var options, methods = { init: function(customSettings) { options = { debug: true } 

Comme fudgy écrit, vous pouvez envisager de définir vos valeurs par défaut en dehors de la méthode init. J’ai essayé de suivre ce même tutoriel et je suis arrivé avec le code suivant combinant parameters et méthodes, mais j’ai rencontré un autre inconvénient.

  (function( $ ){ var config, methods = { init: function(customSettings) { var config = { debug: true } return this.each(function () { if (customSettings) { $.extend(config, customSettings); } }); }, someMethod: function(arg) { if(options.debug) { // do something alert('debug ' + arg); } else { alert('no debug' + arg); } } } $.fn.myplugin = function (method) { if ( methods[method] ) { return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.init.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist on jQuery.myplugin' ); } }; })( jQuery ); 

Mais quand tu appelles ça comme:

 $('p.one').myplugin({ 'debug' : 'false' }); 

Pour le deuxième paragraphe, le débogage est malheureusement toujours faux.

 $('p.two').myplugin('someMethod', 'hmm!'); 

Je dois d’abord commencer le paragraphe par «true» pour pouvoir le déboguer.

 $('p.two').myplugin({ 'debug' : 'true' }); $('p.two').myplugin('someMethod', 'hmm!'); 

Ai-je supervisé quelque chose dans le tutoriel?