jQuery-Métodos Públicos de Widget
Si creo un widget de jQuery (ejemplo de código a continuación) y luego defino un método "público", ¿hay otra forma de llamar al método que no sea usando el siguiente formulario?
$("#list").list("publicMethod");
Me gustaría crear una serie de widgets que definan los mismos métodos (básicamente implementando la misma interfaz), y poder llamar al método sin saber nada sobre qué widget estoy invocando actualmente el método. En la forma actual, necesito saber que estoy ejecutando el método en el widget "lista".
A continuación se muestra un ejemplo de creación de un widget con el método "public".
(function($) {
var items = [];
var itemFocusIdx = 0;
$.widget("ui.list", {
// Standard stuff
options : { ... },
_create : function() { ... },
destroy : function() { ... },
// My Public Methods
publicMethod : function() { ... }
...
});
}(jQuery));
6 answers
Los widgets de interfaz de usuario de jQuery usan $de jQuery.datos(...) método para asociar indirectamente la clase widget con el elemento DOM. La forma preferida de llamar a un método en el widget es exactamente lo que fue descrito por Max...
$('#list').list('publicMethod');
...pero si desea campo un valor devuelto, tendrá mejor suerte llamándolo de esta manera, a través del método de datos:
$('#list').data('list').publicMethod();
Sin embargo, el uso de la segunda forma de pasos laterales todo el patrón de widget de interfaz de usuario de jQuery, y probablemente debería evitarse si es posible.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-14 21:16:49
Un poco fuera de tema, lo sé, pero es posible que desee mirar jquery Entwine.
Esto proporciona una forma de herencia y polimorfismo que permite un comportamiento inteligente con código simple. Parece que esto haría lo que estás tratando de hacer.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-15 03:05:56
Digamos que tienes list
, list2
, y superList
... llamemos "publicMethod" on para cada uno de ellos:
$.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");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-20 21:35:39
Esta solución está inspirada en la solución de @Jiaaro, pero necesitaba un valor de retorno e implementado como una función JavaScript en lugar de extender 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]();
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-09 00:15:17
Prueba esto:
$("#list").list("publicMethod");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-23 12:27:57
Qué tal este:
$("#list").list.publicMethod
A medida que se extiende la interfaz de usuario.listar con su par clave: valor
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-03 14:36:43