Dependent drop-down list from map in Thymeleaf

后端 未结 2 1381
我在风中等你
我在风中等你 2021-01-06 17:52

I want to create a drop-down list with countries and the second drop-down list with cities, which depends on selected value in the first list. And the list of cities should

相关标签:
2条回答
  • 2021-01-06 17:53

    So I have solved my problem with AJAX request and jQuery append.

    1. Change Map<CountryModel, Set<RegionModel>> to Map<String, Set<String>>

    2. AJAX request

      function sendAjaxRequest() {
          var country = $("#country").val();
          $.get( "/regions?country=" + country, function( data ) {
              $("#region").empty();
              data.forEach(function(item, i) {
                  var option = "<option value = " + item + ">" + item +  "</option>";
                  $("#region").append(option);
              });
          });
      };
      
    3. Use sendAjaxRequest() when i change first drop-down list.

      $(document).ready(function() {
          $("#country").change(function() {
              sendAjaxRequest();
          });
      });
      
    4. Drop-down list at the Thymeleaf template

    First drop-down list

    <td th:text="#{country}"/>
    <td>
        <div class="form-group">
            <select th:field="*{model.country}" class="form-control" id="country">
                <option th:each="country : ${model.countries}"
                        th:value="${country}"
                        th:text="${country}">Wireframe
                </option>
            </select>
        </div>
    </td>
    

    Second drop-down list

    <td>
        <div class="form-group">
            <select th:field="*{requestModel.region}" class="form-control" id="region">
            </select>
        </div>
    </td>
    
    1. Controller

      @RequestMapping(value = "/regions")
      @ResponseBody
      public Set getRegions(@RequestParam String country) {
          Map<String, Set<String>> regions = regionsService.getRegions();
          return regions.get(country);
      }
      
    0 讨论(0)
  • 2021-01-06 18:14

    In our project we did it like that:

    <div class="form-group">
        <label class="col-sm-4 control-label" 
               th:text="#{person.edit.policy.tfoms}"></label>
    
        <div class="col-sm-8">
            <select class="form-control" th:field="*{tfoms}" 
                    onchange="loadInsuranceCompanies()">
                <option th:each="t : ${tfomses}" 
                        th:value="${t.uidtfoms}"  
                        th:text="${t.shortName}"
                        th:selected="${personBean.tfoms != null 
                        and personBean.tfoms.equals(t)}">
                </option>
            </select>
        </div>
    </div>
    <div th:class="${#fields.hasErrors('insuranceCompany')} 
         ? 'form-group has-error' : 'form-group'">
        <label class="col-sm-4 control-label" 
              th:text="#{person.edit.policy.ic}">
        </label>
    
        <div class="col-sm-8" id="insuranceCompaniesContent">
            <select class="form-control" id="insuranceCompany" 
                    name="insuranceCompany"  
                    th:fragment="insuranceCompany">
                <option th:each="i : ${insuranceCompanies}" 
                        th:value="${i.uidinsurancecompany}"  
                        th:text="${i.shortName}"
                        th:selected="${personBean.insuranceCompany != null 
                        and personBean.insuranceCompany.equals(i)}">
                </option>
            </select>
            <div th:if="${#fields.hasErrors('insuranceCompany')}" 
             th:each="err : ${#fields.errors('insuranceCompany')}">
            <span class="text-danger" th:text="${err}"></span><br/>
            </div>
        </div>
    </div>
    

    Insurance companies loading function loadInsuranceCompanies():

    function loadInsuranceCompanies() {
        var url = /*[[@{/PersonEdit/insuranceCompanies}]]*/ "/PersonEdit/insuranceCompanies";
        if ($('#tfoms').val() !== '') {
            url = url + '/' + $('#tfoms').val();
        }
        $("#insuranceCompaniesContent").load(url);
    }
    

    And finally code in controller:

    @RequestMapping(value = "/PersonEdit/insuranceCompanies/{tfoms}", method = RequestMethod.GET)
    public String getInsuranceCompaniesByTfoms(@PathVariable("tfoms") Integer tfomsId,
            Model model) {
        model.addAttribute("insuranceCompanies", insuranceCompanyService
                .getInsuranceCompaniesByTfoms(new TerritorialFondOms(tfomsId)));
        return "person/PersonEdit :: insuranceCompany";
    }
    
    0 讨论(0)
提交回复
热议问题