2010-05-05 8 views
29

Wenn ich ein JQuery-Widget (Codebeispiel unten) erstellen und dann eine "public" -Methode definieren, gibt es eine andere Möglichkeit, die Methode anders als das folgende Formular aufzurufen?JQuery - Widget öffentliche Methoden

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

Ich mag würde eine Reihe von Widgets erstellen, die alle die gleichen Methoden (im Wesentlichen der Umsetzung die gleiche Schnittstelle) zu definieren, und in der Lage, die Methode zu nennen, ohne etwas zu wissen, über die Widget ich derzeit das Verfahren am Aufruf auf . In der aktuellen Form muss ich wissen, dass ich die Methode auf dem Widget "Liste" ausführe.


Unten finden Sie ein Beispiel zum Erstellen eines Widgets mit der "public" -Methode.

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

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

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

Müssen sie $ .widget verwenden, oder sind Sie offen für die Verwendung von Vererbung und $ .fn? – balupton

Antwort

22

jQuery UI-Widgets Verwenden Sie die $ .data (...) -Methode von jQuery, um die Widget-Klasse indirekt dem DOM-Element zuzuordnen. Der bevorzugte Weg, ein Verfahren auf das Widget zu nennen ist genau das, was von Max beschrieben wurde ...

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

... aber wenn Sie einen Rückgabewert Feld wollen, werden Sie mehr Glück haben es auf diese Weise aufrufen über die Daten Methode:

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

jedoch die zweite Art und Weise unter Verwendung von Seitenschritten das gesamte Form-Modell jQuery UI, und wahrscheinlich, wenn möglich, vermieden werden sollte.

-2

Wie wäre es dieses:

$("#list").list.publicMethod 

Wie Sie mit Ihrem Schlüssel erweitern ui.list: Wertepaar Set

+0

Scheint nicht – thomaux

0

Try this:

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

Das ist genau zu arbeiten, was die OP nicht versucht, zu tun ... – thomaux

2

Etwas off-topic, ich weiß, aber Sie möchten vielleicht jquery Entwine betrachten.

Dies stellt eine Form der Vererbung und Polymorphismus, die einige clevere Verhalten mit einfachen Code ermöglicht. Es klingt, als würde dies tun, was Sie versuchen zu tun.

1

können sagen, Sie haben list, list2 und superList ... lassen Sie uns auf für jeden von ihnen „publicMethod“ nennen:

$.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

Diese Lösung von @ Jiaaro Lösung inspiriert ist, aber ich brauchte einen Rückgabewert und implementiert als eine JavaScript-Funktion, anstatt jQuery zu erweitern:

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](); 
      } 
     } 
    } 
Verwandte Themen