2011-05-27 9 views
5

He creado un plugin jQuery y funciona bastante bien. Excepto que cuando tengo varias instancias en la misma página, las opciones/configuraciones de la última instancia se usan para ambas.configuración jquery con instancias predeterminadas y múltiples

Aquí hay una versión reducida ... disculpe por la duración.

(function() { 

    var settings = {}; 
    var defaults = { 
     duration : 1000, 
     easingShow : 'easeOutBounce', 
     easingHide : 'easeOutQuad' 
    }; 

    var methods = { 
     init : function(options) { 

      return this.each(function(n) { 

       settings = $.extend(defaults, options); 

      }); 

     }, 

     show : function() { 

      // settings used here 
     }, 

     hide : function() { 
      // also used here 
     } 
    }; 

    $.fn.expander = 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.expander'); 
     } 

    }; 

})(jQuery); 

Estoy seguro de que es un tipo de problema de espacio de nombres, ya que me confunde con frecuencia.

Gracias

Respuesta

6

uso

settings = $.extend(true, {}, defaults, options); 

de documentos jquery @http://api.jquery.com/jQuery.extend/

 
deep  If true, the merge becomes recursive (aka. deep copy). 
target The object to extend. It will receive the new properties. 
object1 An object containing additional properties to merge in. 
objectN Additional objects containing properties to merge in. 

Tenga en cuenta que el objeto de destino (primer argumento) será modificado, y también será devuelto desde $ .extend(). Sin embargo, si queremos preservar ambos objetos originales, podemos hacerlo pasando un objeto vacío como el objetivo.

la configuración que tiene por elemento, puede almacenarlos en cada elemento utilizando .data()

Salida una demostración de trabajo: http://jsfiddle.net/roberkules/XvKs8/

+0

Gracias, pero creo que te has perdido el tema. El problema no está en la forma en que estoy configurando la variable de configuración. Es que si lo configuro en la sección 'return this.each (function() {});', entonces no puede acceder a la función show and hide. Pero si lo configuro afuera, como lo he hecho, es lo mismo para cada elemento que tenga el complemento habilitado en él. – ianbarker

+0

Compruebe la demostración, debería hacer lo que necesita. – roberkules

+1

Quisiera intentar y evitar el uso de datos() pero supongo que es la única manera. – ianbarker

Cuestiones relacionadas