2013-09-17 2 views
0

Очень сложно назвать эту вещь. Я использую плагин contextMenu для jQuery.Создание динамического массива JSON с обратными вызовами (проблема внутреннего закрытия)

http://joewalnes.com/2011/07/22/a-simple-good-looking-context-menu-for-jquery/

Он может принять массив элементов, так что я могу динамически создавать меню на основе объекта JSON я установил ранее называемые «пакеты» с не более чем массивом объектов JSON, содержащий идентификатор и Заголовок. Например:

var packages = [{id:1,title:"One"},{id:2,title"Two"}]; 

Как вы могли бы сказать, из примера в ссылке, которую я добавил, «Элемент» состоит из, как минимум, метка и функция обратного вызова (который выполняется при выборе пункта). Так что моя первая мысль была сделать это:

var itemsArr = new Array(); 
for(var i=0; i<packages.length; i++) 
{ 
    itemsArr.push({label:packages[i].title, action:function(){myClickFunction(packages[i].id);}}); 
} 
$("#myMenuThingie").contextPopup({title:"My Popup", items:itemsArr}); 

Теперь, я проверил, что я могу, Infact передать массив, чтобы сделать эту работу должным образом меню. Проблема, я думаю, является проблемой внутреннего закрытия. Поскольку myClickFunction всегда получает значение последнего идентификатора, независимо от того, что нажимается.

Я нашел статью о «Сразу же запущенной функции Выражения» здесь: http://benalman.com/news/2010/11/immediately-invoked-function-expression/, в результате этой модификации:

for(var i=0; i<packages.length; i++) 
{ 
    itemsArr.push({label:packages[i].title, action:(function(tempId){myClickFunction(tempId);})(packages[i].id)}); 
} 

однако, этот метод не будет реально работать либо потому, что он сразу же вызывает эти функции, а не на нажмите кнопку.

Я знаю, что я мог бы попытаться использовать jQuery, чтобы найти все промежутки, сгенерированные выпадающим списком, и применить события кликов таким образом. Мне просто интересно, есть ли способ создать этот массив объектов с обратными вызовами, ссылающимися на правильный идентификатор. Я также буду принимать предложения для других плагинов contextMenu, если это позволяет мне динамически применять элементы аналогичным образом.

Любые мысли?

ответ

1

Возможно, я создал бы отдельную функцию для подачи пакетов в массив. Что-то вроде этого:

var itemsArr = new Array(); 
function addToArray(package) { 
    itemsArr.push({label:package.title, action:function(){myClickFunction(package.id);}}); 
} 
for(var i=0; i<packages.length; i++) 
{ 
    addToArray(packages[i]); 
} 
$("#myMenuThingie").contextPopup({title:"My Popup", items:itemsArr}); 
+0

Это похоже на работу. Интересно. Благодаря! – AceCorban

Смежные вопросы