2016-10-11 2 views
0

У меня есть вызов Ajax, возвращающий массив из silverstripe-function.javascript fill optogrouped dropdown

{ 
    "null":"-- Person/choose Email --", 
    "System":{ 
     "default":"[email protected]"}, 
    "Office":{ 
     "21":"[email protected]", 
     "22":"[email protected]", 
     "23":"[email protected]", 
     "24":"[email protected]" 
     }, 
    "Workshop":{ 
     "22":"[email protected]" 
     } 
} 

Я пытаюсь заполнить вариант - сгруппированный - выпадающий список без успеха.

$.ajax({ 
    url: "StringImage_Ajax/dropdownSource", 
    type: "POST", 
    dataType: "json", 
    async:false 
}).done(function(data){ 
    dddata = JSON.stringify(data.string); 
    console.log('data = ' + dddata); 
    var dropdown = $('#StringEmail'); 

    /*$.each(dddata, function (key, cat) { 
     console.log(key + ' _ ' + cat); 
     var group = $('<optgroup>',{label:key}); 
     $.each(cat,function(i,item) { 
      $("<option/>",{value:item.id,text:item.name}) 
       .appendTo(group); 
     }); 
     group.appendTo(dropdown); 
    });*/ 

}); 

Каким образом каждая - функция должна быть изменена, чтобы работать должным образом?

благодарит заранее.sepp.

UPDATE:

благодаря @Endless рабочего кода:

var dropdown = $('#StringEmail').empty(); 

       $.each(dddata, function (key, cat) { 
        if (typeof cat === 'string') { 
         $('<option/>', {value:key,text:cat}).appendTo(dropdown) 
         return 
        } 
        var group = $('<optgroup>', {label: key}); 

        $.each(cat, function(value, text) { 
         $("<option/>", {value:value,text:text}).appendTo(group); 
        }); 
        group.appendTo(dropdown); 
       }); 
+0

Не устанавливайте асинхронное значение false! Он устарел ... – Endless

+0

Вам нужно выполнить итерацию по вложенному «объекту» в возвращаемых вами данных. Это не массив. Вы можете попробовать 'for (var key in obj) {if (obj.hasOwnProperty (key) {//}}' или использовать 'Object.keys (obj)' для итерации по клавишам объекта, а затем заполнить опцию ' 'элемент динамически. –

ответ

0

Ненужные, чтобы показать Аякса часть, но так или иначе ... Вы почти получили его.

var dropdown = $("<select>") 

$.each(dddata, function (key, cat) { 
    if (typeof cat === 'string') { 
    $('<option disabled>', {text: cat}) 
    .appendTo(dropdown) 
    return 
    } 

    var group = $('<optgroup>', {label: key}) 

    $.each(cat, function(value, text) { 
    $('<option>', {value, text}) 
    .appendTo(group); 
    }); 

    group.appendTo(dropdown); 
}) 
+0

получил его работу, спасибо. см. мой обновленный вопрос наверху. –