2013-01-02 11 views
11

Ho usato il jQuery Boilerplate per lo sviluppo di plugin e una cosa che non riesco a capire è come chiamare metodi dall'esterno del plugin.Metodi di chiamata che utilizzano il modello di progettazione jQuery Plugin

Per riferimento, ecco il codice boilerplate sto parlando: http://jqueryboilerplate.com/

Nel mio violino,

http://jsfiddle.net/D9JSQ/2/

Ecco il codice:

;(function ($, window, document, undefined) { 

    var pluginName = 'test'; 
    var defaults; 

    function Plugin(element, options) { 
     this.element = element; 

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

     this._name = pluginName; 

     this.init(); 
    } 

    Plugin.prototype = { 
     init: function() { 
      this.hello(); 
     }, 
     hello : function() { 
      document.write('hello'); 
     }, 
     goodbye : function() { 
      document.write('goodbye'); 
     } 
    } 


    $.fn[pluginName] = function (options) { 
      return this.each(function() { 
       if (!$.data(this, 'plugin_' + pluginName)) { 
        $.data(this, 'plugin_' + pluginName, 
        new Plugin(this, options)); 
       } 
      }); 
    } 


})(jQuery, window, document); 

$(document).ready(function() { 
    $("#foo").test(); 
    $("#foo").test('goodbye'); 
}); 

I Sto cercando di chiamare il metodo addio usando la seguente sintassi:

$("#foo").test('goodbye') 

Come ottengo questo? Grazie in anticipo

+0

È possibile visualizzare [la mia risposta a questa domanda] (http://stackoverflow.com/a/13778012/417685). Ha un modello di plugin jQuery con metodi accessibili che assomigliano molto a questo, ma non è lo stesso – Alexander

+0

Dal wiki jplery boilerplate: https://github.com/jquery-boilerplate/jquery-boilerplate/wiki/Extending- jQuery-Boilerplate – jackocnr

risposta

18

Dovrai ottenere un riferimento alla classe per chiamare il suo metodo con quella struttura di plugin.

http://jsfiddle.net/D9JSQ/3/

$(document).ready(function() { 
    var test = $("#foo").test().data("plugin_test"); 
    test.goodbye(); 
}); 

di fare ciò che si vuole, è necessario sbarazzarsi di document.write per testarlo.

http://jsfiddle.net/D9JSQ/8/

; 
(function($, window, document, undefined) { 

    var pluginName = 'test'; 
    var defaults; 

    function Plugin(element, options) { 
     this.element = element; 

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

     this._name = pluginName; 

     this.init(); 
    } 

    Plugin.prototype = { 
     init: function(name) { 
      this.hello(); 
     }, 
     hello: function(name) { 
      console.log('hello'); 
     }, 
     goodbye: function(name) { 
      console.log('goodbye'); 
     } 
    } 


    $.fn[pluginName] = function(options) { 
     return this.each(function() { 
      if (!$.data(this, 'plugin_' + pluginName)) { 
       $.data(this, 'plugin_' + pluginName, new Plugin(this, options)); 
      } 
      else if ($.isFunction(Plugin.prototype[options])) { 
       $.data(this, 'plugin_' + pluginName)[options](); 
      } 
     }); 
    } 


})(jQuery, window, document); 

$(document).ready(function() { 
    $("#foo").test(); 
    $("#foo").test('goodbye'); 
});​ 

sguardo alla console per informazioni.

+0

Ho visto un pattern da qualche parte dove memorizza tutti i metodi in un array e controlla se le opzioni quando viene chiamato il plug-in, è una stringa e se lo è, chiama quel metodo. È possibile con questa struttura? –

+1

Sì, dovresti semplicemente aggiungere un elseif alla tua struttura che controlla il prototipo per un metodo esistente. Se esiste, viene eseguito. Ecco un buon esempio, inutile reinventare la ruota: http://keith-wood.name/pluginFramework.html –

+0

@AndrewH Ho risposto a una domanda simile a if/else qui: http://stackoverflow.com/ questions/14078481/plug-in-call-a-function-in-a-simple-plug-in/14078885 # 14078885 Recentemente ho notato questo nuovo pattern per lo sviluppo di plugin jQuery, controllerò il collegamento boilerplate che hai postato . – Syon