Как создать форму, в которой один выпадающий список определяет параметры другого

#javascript #node.js #json #forms #alpacajs

#javascript #node.js #json #формы #alpacajs

Вопрос:

Мне нужно создать форму с 3 выпадающими полями, где каждое выпадающее окно должно заполняться параметрами, основанными на выборе предыдущего. У меня есть все мои данные в объекте.

Например:

 {
  "campaign1": {
    "name": "Campaign 1",
    "projects": {
      "job A": [
        "proj 1"
      ],
      "job B": [
        "proj 2",
        "proj 3"
      ]
    }
  },
  "campaign2": {
    "name": "Campaign 2",
    "projects": {
      "job C": [
        "proj 4",
        "proj 5",
        "proj 6"
      ],
      "job D": [
        "proj 7",
        "proj 8",
        "proj 9"
      ]
    }
  }
}
  

Идея заключается в том, что сначала вы выбираете «Кампанию», затем во 2-м выпадающем списке отображаются только «Задания» для этой кампании, затем в 3-м отображаются только «Проекты» для этого задания.

Я начал с https://github.com/json-editor/json-editor но, похоже, он не способен делать то, что мне нужно. Я также посмотрел alpaca, но это сложно.

Alpaca имеет optiontree тип поля, но, похоже, это не соответствует тому, что я хочу (в том смысле, что я не присваиваю «атрибуты» «значению»), хотя отображаемая версия ведет себя так, как я хочу.

Я хотел бы использовать свой объект данных как есть, хотя при необходимости я могу переструктурировать его.

В принципе, я хочу что-то вроде средства выбора драйверов на nvidia… https://www.nvidia.com/download/index.aspx Сначала выберите тип, затем серию на основе типа и т.д…

Спасибо!

Ответ №1:

Я просто изменил структуру объекта для своего удобства. Это упрощает реализацию. используйте значение индекса в качестве атрибута value в теге option, который можно использовать для извлечения дочернего объекта для следующего фильтра. Я создал пример кода для второго фильтра на основе результата campaign filter.

 $('select').on('change', function() {
   var selected_index = $(this).children("option:selected").val();
   var selected_val = $(this).children("option:selected").html();
   var obj = [{
     "Campaign 1": {
     "name": "Campaign 1",
        "jobs": [{
            "name" : "job A",
            "projects": [
               "proj 1"
             ]},{
            "name" : "job B",  
            "projects": [
                "proj 2",
                "proj 3"
             ]}
         ]}
       },{
     "Campaign 2": {
          "name": "Campaign 2",
          "jobs": [{
               "name" : "job C",
               "projects": [
                   "proj 4",
                   "proj 5",
                   "proj 6"
               ]},{
               "name" : "job D",
               "projects": [
                   "proj 7",
                   "proj 8",
                   "proj 9"
               ]}
           ]}
       }];
   jQuery('#select_2').html('');
   obj[selected_index[selected_val].jobs.forEach( function(data, index){
     jQuery('#select_2').append('<option value="index">data</option>');
   });
});  

Ответ №2:

Другой вариант, который вы могли бы использовать для замены источника данных для каждого поля, в зависимости от предыдущего выбора. Вот рабочий JS Fiddle, где параметры выпадающего списка определяются предыдущим выбором: https://jsfiddle.net/bsunderland/78hybL3v/3 /

Кроме того, вот некоторый пример кода для настройки параметров в select на основе предыдущего выбора поля, но с вызовом на стороне сервера:

 "postRender": function(control) {
            var parentType = control.childrenByPropertyId["Parent_LookupTypeCode"]; //Grab the Parent Lookup Type Object
            var parentCode = control.childrenByPropertyId["Parent_LookupCode"]; //Grab the Parent Lookup Object
            parentCode.subscribe(parentType, function(val) {//Subscribe parentCode to changes to parentType
                // alert(val);
                if(!val) {//val = value of parentType
                    val="Metrics"; //If missing, do nothing
                }
                else{
                    this.options.dataSource = "./ExtraStuff/Load_Lookups.php?q="   val; //Load values based on val of parentType
                }

                this.refresh(); //Refresh the form. This is needed. Without it, the updated options won't show
            });
        }