jquery ui - вызывать методы с одинаковыми именами в разных виджетах

0

Предположим, что я создал несколько виджетов (mywidget1, mywidget2,...) и что у всех есть метод с тем же именем (doSomething).
Чтобы вызвать метод, я могу использовать:

$("#elem").widget1("doSomething");  

но таким образом мне нужно знать имя виджета (в примере widget1).
Если у меня есть массив с несколькими экземплярами различных виджетов, как я могу вызвать на каждом из них метод "doSomething", не зная имя виджета?

Теги:
methods
widget

4 ответа

0
Лучший ответ

Я нашел это решение:

до:

var tmp = $("#elem").widget1();
myarray[i] = tmp;

Теперь:

var tmp = $("#elem").widget1();
myarray[i] = tmp.data(ui-widget1);

таким образом, можно напрямую вызвать метод:

myarray[x].doSomething();

что вы думаете?
может быть эффективным решением?

Спасибо всем

0

В теории, я полагаю, вы могли бы сделать что-то вроде следующего:

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 :)
}

В любом случае, попробуйте выше, с вершины моей головы я не уверен, что будет работать. Я думаю, что то, что вы пытаетесь сделать, может быть немного сложно реализовать, поэтому извините, если он не работает. Надеюсь, это будет :)

0

вы можете иметь объект функций и динамически получать ключевое значение для использования конкретной функции

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
0

Вы не можете. Два варианта для вас:

  1. Храните их в отдельных массивах (один массив для widget1, другой для widget2) или

  2. Хранить объекты в массивах, содержащих информацию о том, какой виджет относится к этой записи

Вот пример # 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");
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню