2015-03-02 4 views
1

У меня есть вложенная JSON как это:

[{ 
"1": { 
    "name": "Mobile" 
}, 
"5": { 
    "name": "Savings", 
    "childs": { 
     "27": { 
      "name": "Children" 
     } 
    } 
}, 
"6": { 
    "name": "Pro Expenses" 
}, 
"7": { 
    "name": "Salary", 
    "childs": { 
     "143": { 
      "name": "Salary Savings" 
     } 
    } 
}, 
"8": { 
    "name": "Food", 
    "childs": { 
     "13": { 
      "name": "Lunch Food", 
      "childs": { 
       "53": { 
        "name": "Coffee" 
       } 
      } 
     }, 
     "91": { 
      "name": "Canteen" 
     }, 
     "93": { 
      "name": "Market" 
     } 
    } 
}] 

Я хотел бы создать вложенный выбор с OPTGROUP и опции, как это:

<SELECT> 
<OPTION value="1">Mobile</OPTION> 
<OPTGROUP name="Savings"> 
    <OPTION value="27">Children</OPTION> 
</OPTGROUP> 
<OPTION value="6">Pro Expenses</OPTION> 
<OPTGROUP name="Salary"> 
    <OPTION value="143">Salary Savings</OPTION> 
</OPTGROUP> 
<OPTGROUP name="Food"> 
    <OPTGROUP name="Lunch Food"> 
     <OPTION value="53">Coffee</OPTION> 
    </OPTGROUP> 
    <OPTION value="91">Canteen</OPTION> 
    <OPTION value="93">Market</OPTION> 
</OPTGROUP> 
</SELECT> 

Я знаю, что вложенный OPTGROUP недействителен. Но это не главное, что я хочу обсудить здесь. ;)

Код моей JQuery ниже не работает из-за третьих параметров каждого из них, которые не поддерживаются.

$.getJSON("/?act=get_json_data",{data:'categories'}, function(json) { 
    var select = $('#categories'); 
    $.each(json, function add_optgroup(k, item, parent=select) { 
     if (typeof(item.childs) !== 'undefined') { 
      var group = $('<optgroup>',{label:item.name}); 
      $.each(item.childs, add_optgroup(ck, citem, group)); 
      group.appendTo(parent); 
     } else { 
      $("<option/>",{value:k,text:item.name}) 
        .appendTo(parent); 
     } 
    }); 

Я пробовал много решений, но из-за «.appendTo()», мне нужен родитель, и каждый не позволяет третий параметр.

Любая помощь приветствуется;)

ответ

1

Используйте другой вложенной функции, чтобы преодолеть разрыв между 3-Arg функции вызова вы хотите, и внутренний each обратного вызова:

$.each(item.childs, function(ck, citem) { add_optgroup(ck, citem, group) }); 

Эта функция получает ключ/значения от each и добавляет третий аргумент group, к которому у него есть доступ как часть охватывающей области.

+0

Большое спасибо, это работает как шарм! – Kitof

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