Предположим, что я создал несколько виджетов (mywidget1, mywidget2,...) и что у всех есть метод с тем же именем (doSomething).
Чтобы вызвать метод, я могу использовать:
$("#elem").widget1("doSomething");
но таким образом мне нужно знать имя виджета (в примере widget1).
Если у меня есть массив с несколькими экземплярами различных виджетов, как я могу вызвать на каждом из них метод "doSomething", не зная имя виджета?
Я нашел это решение:
до:
var tmp = $("#elem").widget1();
myarray[i] = tmp;
Теперь:
var tmp = $("#elem").widget1();
myarray[i] = tmp.data(ui-widget1);
таким образом, можно напрямую вызвать метод:
myarray[x].doSomething();
что вы думаете?
может быть эффективным решением?
Спасибо всем
В теории, я полагаю, вы могли бы сделать что-то вроде следующего:
var widgets = [widget1, widget2, widget3]; // etc, will assume they are defined already
// Access each Widget, now widget points to each of the widgets
// So we dont need to know the actual name like widget1, widget2 etc
widgets.forEach(function (widget) {
$('#elem').widget('doSomething'); // Call the doSomething method of this widget
$('#elem').widget.call(null, 'doSomething'); // Try this if the above fails
$('#elem').call(widget, 'doSomething'); // Or maybe this :)
}
В любом случае, попробуйте выше, с вершины моей головы я не уверен, что будет работать. Я думаю, что то, что вы пытаетесь сделать, может быть немного сложно реализовать, поэтому извините, если он не работает. Надеюсь, это будет :)
вы можете иметь объект функций и динамически получать ключевое значение для использования конкретной функции
widgets = {
widget1 : function(value){return value;},
widget2 : function(value){return value+1},
widget3 : function(value){return value+2}
}; //you can have your list of functions say widgets1,2,3....
for(var k in widgets ){
console.log(widgets[k](1));
} //to get the function name you can use the key name in the object
Пример на https://gist.github.com/vishnu667/44063d64f2d1210c26c9
вы также можете вызвать функцию, если знаете ключ
widgets['widget2'](10); //to directly call the function if you know the key
Динамически добавлять больше виджетов
function add_widget(name,widgetFunction){ //function to add widget
widgets[name]=widgetFunction;
}
add_widget("widget4",function(value){return value+10;}); //adds a new widget to the widgets list
Вы не можете. Два варианта для вас:
Храните их в отдельных массивах (один массив для widget1, другой для widget2) или
Хранить объекты в массивах, содержащих информацию о том, какой виджет относится к этой записи
Вот пример # 2
var list = [
{widget: "widget1", element: $("#elem")},
{widget: "widget2", element: $(".some-selector")},
{widget: "widget2", element: $("#another")},
{widget: "widget1", element: $("div .target")}
];
$.each(list, function(i, entry) {
entry.element[entry.widget]("doSomething");
});