2013-01-02 14 views
11

Używam jQuery Boilerplate do tworzenia wtyczek i nie mogę jednoznacznie stwierdzić, jak wywołać metody spoza wtyczki.Metody wywołań za pomocą wzoru jQuery Plugin

Dla porównania, tutaj jest kod boilerplate mówię: http://jqueryboilerplate.com/

W moim skrzypce,

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

Oto kod:

;(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 próbuję wywołać metodę pożegnalną, używając następującej składni:

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

Jak to osiągnąć? Z góry dziękuję

+0

Możesz zobaczyć [moja odpowiedź na to pytanie] (http://stackoverflow.com/a/13778012/417685). Ma szablon wtyczki jQuery z dostępnymi metodami, które faktycznie bardzo przypominają ten jeden, ale nie jest taki sam – Alexander

+0

Z jQuery: wikiplate: https://github.com/jquery-boilerplate/jquery-boilerplate/wiki/Extending- jQuery-Boilerplate – jackocnr

Odpowiedz

18

Będziesz musiał uzyskać odwołanie do klasy, aby wywołać jej metodę z tą strukturą wtyczki.

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

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

Aby zrobić to, co chcesz, musisz pozbyć document.write go przetestować.

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'); 
});​ 

Look do konsoli do informacji.

+0

Widziałem wzorzec gdzieś przechowuje wszystkie metody w tablicy i sprawdza, czy opcje, gdy wtyczka jest wywoływana, jest ciągiem, a jeśli jest, to wywołuje tę metodę. Czy to możliwe dzięki tej strukturze? –

+1

Tak, po prostu dodajesz elseif do struktury, która sprawdza prototyp dla istniejącej metody. Jeśli istnieje, zostaje wykonany. Oto dobry przykład, nie ma sensu ponownie odkrywać koła: http://keith-wood.name/pluginFramework.html –

+0

@AndrewH Odpowiedziałem na podobne pytanie do if/else here: http://stackoverflow.com/ pytania/14078481/not-to-call-a-function-in-a-simple-jquery-plugin/14078885 # 14078885 Niedawno zauważyłem ten nowy wzorzec do rozwijania wtyczek jQuery, sprawdzę, że opublikowany link na płycie głównej . – Syon