2010-05-05 8 views
29

Jeśli utworzę widget JQuery (przykład kodu poniżej), a następnie zdefiniuję metodę "publiczną", czy istnieje inny sposób wywołania tej metody niż użycie poniższego formularza?JQuery - Widget Metody publiczne

$("#list").list("publicMethod"); 

Chciałbym stworzyć serię widżety, że wszystkie definiują te same metody (w zasadzie realizacji tego samego interfejsu) i być w stanie wywołać metodę, nie wiedząc nic o której widżet Obecnie m wywoływanie metody na . W obecnej formie muszę wiedzieć, że wykonuję metodę w widgecie "list".


Poniżej znajduje się przykład tworzenia widgetu metodą "publiczną".

(function($) { 
    var items = []; 
    var itemFocusIdx = 0; 

    $.widget("ui.list", { 
     // Standard stuff 
     options : { ... }, 
     _create : function() { ... }, 
     destroy : function() { ... }, 

     // My Public Methods 
     publicMethod : function() { ... } 
     ... 
    }); 
}(jQuery)); 
+0

Czy muszą używać rozszerzenia $ .widget, czy jesteś otwarty na dziedziczenie i $ .fn? – balupton

Odpowiedz

22

jQuery UI widgety Użyj metody $ .data (...) jQuery do pośredniego powiązania klasy widgetu z elementem DOM. Preferowanym sposobem wywołania metody na widget jest dokładnie to, co zostało opisane przez Max ...

$('#list').list('publicMethod'); 

... ale jeśli chcesz pola wartości zwracanej, będziesz miał więcej szczęścia nazywając go w ten sposób , metodą danych:

$('#list').data('list').publicMethod(); 

Jednakże, za pomocą drugiego sposobu bocznego kroki cały jQuery UI widget wzór, i prawdopodobnie jest w miarę możliwości unikać.

-2

Jak o tym jednym:

$("#list").list.publicMethod 

Jak przebiegają ui.list z kluczem: pary wartości ustawionej

+0

Wydaje się nie działać – thomaux

0

Spróbuj tego:

$("#list").list("publicMethod"); 
+4

To jest dokładnie to, co OP próbuje nie robić ... – thomaux

2

Nieco poza tematem, wiem, ale możesz chcieć spojrzeć na jquery Entwine.

Zapewnia to formę dziedziczenia i polimorfizm, który pozwala na pewne sprytne zachowanie za pomocą prostego kodu. Wygląda na to, że zrobi to, co chcesz zrobić.

1

powiedzmy masz list, list2 i superList ... nazwijmy „publicMethod” na każdego z nich:

$.fn.callWidgetMethod = function(method) { 
    var $this = this, 
     args = Array.prototype.slice.call(arguments, 1); 

    // loop though the data and check each piece of data to 
    // see if it has the method 
    $.each(this.data(), function(key, val) { 
    if ($.isFunction(val[method])) { 
     $this[key].apply($this, args); 

     // break out of the loop 
     return false; 
    } 
    }); 
} 

$("#some-element").list(); 
$("#another-element").list2(); 
$("#hydrogen").superList(); 

$("#some-element").callWidgetMethod("publicMethod"); 
$("#another-element").callWidgetMethod("publicMethod"); 
$("#hydrogen").callWidgetMethod("publicMethod"); 
0

To rozwiązanie jest inspirowana przez @ rozwiązania Jiaaro, ale ja potrzebowałem wartości zwracanej i zaimplementowane jako funkcja JavaScript, zamiast rozszerzania jQuery:

var invokeWidgetMethod = function(methodName, widgetElem) 
    { 
     var $widgetElem = $(widgetElem), 
      widgetData = $widgetElem.data(), 
      dataName, 
      dataObject; 

     for(dataName in widgetData) 
     { 
      dataObject = widgetData[dataName]; 
      if ($.isFunction(dataObject[methodName])) { 
       return dataObject[methodName](); 
      } 
     } 
    } 
Powiązane problemy