Зависимые списки с подгрузкой данных из JSON

86
17 сентября 2019, 11:30

Есть пока 1 списка. Родитель

Данные в список приходят из json файла:

{"ants": [
  {
    "rod": "Messor",
    "vid": [{
            "vname": "Structor"
            },
            {
            "vname": "Minor"
            }]
  },
  {
    "rod": "Camponotus",
    "vid": [{
            "vname": "Vagus"
            },
            {
            "vname": "nicobarensis"
            }]
  },
  {
    "rod": "Lasius",
    "vid": [{
            "vname": "Niger"
            },
            {
            "vname": "Flavus"
            }]
  }
]}

Вывожу первый список вот так:

<select id="people"></select>
<script>
$select = $('#people');
$.ajax({
url: 'ants.json',
dataType:'JSON',
success:function(data){
$select.html('');
$.each(data.ants, function(key, val){
$select.append('<option id="' + val.id + '">' + val.name + '</option>');
})
},
error:function(){
$select.html('<option id="-1">none available</option>');
}
});
</script>

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

Например, при выборе в первом списке Messor, во втором списке выводились 2 значения из json: Structor и Minor

Answer 1

После создания первого select нужно повесить на него обработчик change в котором можно менять второй select

function ajax() { 
  var json = { 
    "ants": [{ 
        "rod": "Messor", 
        "vid": [{ 
            "vname": "Structor" 
          }, 
          { 
            "vname": "Minor" 
          } 
        ] 
      }, 
      { 
        "rod": "Camponotus", 
        "vid": [{ 
            "vname": "Vagus" 
          }, 
          { 
            "vname": "nicobarensis" 
          } 
        ] 
      }, 
      { 
        "rod": "Lasius", 
        "vid": [{ 
            "vname": "Niger" 
          }, 
          { 
            "vname": "Flavus" 
          } 
        ] 
      } 
    ] 
  }; 
  return new Promise(function(res) { 
    return res(json); 
  }); 
} 
var $select = $('#people'); 
var $selectVid = $('#vid'); 
ajax().then(function(data) { 
  $select.html(''); 
  $select.append(data.ants.map(function (val, key) { 
    return '<option value="' + key + '">' + val.rod + '</option>'; 
  })); 
  $select.on('change', function () { 
    var index = $(this).val(); 
    $selectVid.empty() 
      .append(data.ants[index].vid.map(function (val) { 
        return '<option id="' + val.vname + '">' + val.vname + '</option>'; 
    })); 
  }).change(); 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<select id="people"></select> 
<select id="vid"></select>

READ ALSO
Как парсить csv json-парсером от OKTELL

Как парсить csv json-парсером от OKTELL

Товарищи, ниже у меня есть пример, для парсера в Oktell, как мне заставить его читать файлcsv?

78
Два слайдера на одной странице

Два слайдера на одной странице

на странице есть два вот таких блока:

107
Google Chart PieChart позиционирование pieSliceText

Google Chart PieChart позиционирование pieSliceText

Здравствуйте у меня техт выходит за пределы графика как его можно с позиционировать?

80