2011-05-05 10 views
5

Al igual que muchas otras preguntas similares aquí, estoy escribiendo mi primer plugin de jQuery. Está destinado a tomar un elemento seleccionado y reemplazar las opciones con elementos de lista seleccionables, para usar como muestras. Tengo la funcionalidad principal funcionando bien, pero necesito agregar la capacidad de llamar a otro método, lo que deshabilitará ciertas opciones. Mi problema es que, al hacer esto, debo vincular algunos elementos de clic y desvincular a otros.Complementos de Jquery, llamando a funciones de otros métodos

Actualmente mi encuadernación original está contenida en una función dentro de mi método 'init'. Necesito poder llamar a esa función desde otro método de "desactivación". Así que aquí hay un código:

(function($){ 

var methods = { 

    // Init method 
     init : function(options) { 
      // Set options 
      var 
       defaults = { 
         clickCallback: function(){} // Define empty function for click callback 
        } 
      , settings = $.extend({}, defaults, options) 


      // Function to bind options 
      function fnBindOptions(var1, var2, var3) { 
       // Stuff to bind elements 

        // Hit the click callback 
        settings.clickCallback.call(this); 

      } 

      return this.each(function() { 

       // Check that we're dealing with a select element 
       if(element.is('select')) { 

        // Loop through the select options and create list items for them 
        $('option', element).each(function() { 

         // Stuff to create list elements 

         // Bind click handler to the new list elements 
         fnBindOptions(var1, va2, var3); 
        }); 

       } 

      }); 

      // return 
      return this();    
     } 


    // Disable buttons method 
    , disable : function(options) { 

      // I need to access fnBindOptions from here 
      $(elementID).children('li').removeClass('disabled').each(function(){ 
       fnBindOptions(var1, var2, var3); 
      }); 

     } 
}; 

Aquí es mi problema: Tengo que llamar a la función se unen en cada opción antes de su desactivación - pero no puedo acceder fnBindOptions desde dentro del método desactivar - y debido a fnBindOptions incluye una devolución de llamada de la variable 'configuración', tampoco puedo moverlo fuera del método 'init'.

Entonces, ¿alguien tiene algún consejo aquí?

Gracias!

Respuesta

6

Una manera de resolver esto es para poner su función defaults, settings y bindOptions en el methods objeto (u otro objeto en el ámbito más amplio) y hacer referencia a ellos en consecuencia:

var methods = { 
    defaults: { 
     clickCallback: function() {} 
    }, 
    settings: {}, 

    bindOptions: function(var1, var2, var3) { 
     // Stuff to bind elements 
     // Hit the click callback 
     methods.settings.clickCallback.call(this); 
    }, 

    // Init method 
    init: function(options) { 
     methods.settings = $.extend({}, methods.defaults, options); 

     return this.each(function() { 
      if (element.is('select')) { 
       $('option', element).each(function() { 
        // Stuff to create list elements 
        // Bind click handler to the new list elements 
        methods.bindOptions(var1, va2, var3); 
       }); 
      } 
     }); 
    }, 

    // Disable buttons method 
    disable: function(options) { 
     $(elementID).children('li') 
        .removeClass('disabled') 
        .each(function() { 
      methods.bindOptions(var1, var2, var3); 
     }); 
    } 
}; 
+1

brillante, que parece funcionar perfectamente . ¡¡Gracias!! –

+0

Una gran respuesta, sin duda me ayudó, gracias. – Asciant

+0

Aparece una advertencia de que es posible que los "métodos" aún no se hayan inicializado, ¿pasa esto a JSLint? –

Cuestiones relacionadas