【问题标题】:Dynamically increment name property in an html form?在html表单中动态增加名称属性?
【发布时间】:2021-07-12 12:45:02
【问题描述】:

我正在尝试使用动态创建的表单将多个数据立即发送到数据库,当我点击添加按钮时,该表单会添加新字段。我已经完成了大部分项目,但是要将数据发送到控制器,我需要动态地增加我无法做到的 name 属性。我是春季广告 Jquery 的新手。目前我只能发送索引为 0 和 1 的两个数组对象。

这是我的html表单

<script>
    $(document).ready(function(){
    //group add limit
    var maxGroup = 10;
    
    //add more fields group
    $(".addMore").click(function(){
        if($('body').find('.fieldGroup').length < maxGroup){
            var fieldHTML = '<div class="form-group fieldGroup">'+$(".fieldGroupCopy").html()+'</div>';
            $('body').find('.fieldGroup:last').after(fieldHTML);
        }else{
            alert('Maximum '+maxGroup+' groups are allowed.');
        }
    });
    
    //remove fields group
    $("body").on("click",".remove",function(){ 
        $(this).parents(".fieldGroup").remove();
    });
});
</script>
  </head>
  <body>
    <nav class="navbar navbar-expand-lg navbar-dark bg-secondary">
    
  <a class="navbar-brand" th:href="@{/}" href="#">
  <img src="" class="logo" th:src="@{/image/logo.png}" alt="logo">
  Assam Power Distribution Company Limited</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
   
  </div>
</nav>

<form method="post" th:action="@{/addfeeder}" th:object="${feeder}">
            
    <div class="form-group fieldGroup" >
        <div class="input-group mt-1 p-1 bg-light">
            <input type="text" name="feeder[0].feeder_name" class="form-control" placeholder="Enter Feeder name" />
  <select name="feeder[0].feeder_type" class="custom-select" id="inputGroupSelect01">
    <option selected>Choose Capacity</option>
    <option value="11">11</option>
    <option value="33">33</option>
  </select>
          
            <input type="text" name="feeder[0].no_of_consumer_in_the_feeder" class="form-control" placeholder="Total Consumers"/>
            <div class="input-group-addon"> 
                <a href="javascript:void(0)" class="btn btn-success addMore"><span class="glyphicon glyphicon glyphicon-plus" aria-hidden="true"></span> Add</a>
            </div>
        </div>
    </div>
    
    <input type="submit" name="submit" class="btn btn-primary" value="SUBMIT"/>
    
</form>


<!-- copy of input fields group -->
<div class="form-group fieldGroupCopy" style="display: none;">
    <div class="input-group mt-1 p-1 bg-light">
        <input type="text" name="feeder[1].feeder_name" class="form-control" placeholder="Enter Feeder name"/>
        <select name="feeder[1].feeder_type" class="custom-select" id="inputGroupSelect01">
    <option selected>Choose Capacity</option>
    <option value="11">11</option>
    <option value="33">33</option>
  </select>
        
        <input type="text" name="feeder[1].no_of_consumer_in_the_feeder" class="form-control" placeholder="Enter Consumers"/>
        <div class="input-group-addon"> 
            <a href="javascript:void(0)" class="btn btn-danger remove"><span class="glyphicon glyphicon glyphicon-remove" aria-hidden="true"></span> Remove</a>
        </div>
    </div>
</div>

这是我的控制器


    //adding feeder details
    @PostMapping("/addfeeder")
    public String addFeeder(@ModelAttribute FeederList feederlist)
    {

        System.out.println("Data"+feederlist);
        
        System.out.println(feederlist.getFeeder().size());
        
        for(Feeder c:feederlist.getFeeder())
               System.out.println(c);
        return "feeder";
        
        
    }
    
    public class FeederList {
        private List<Feeder> feeder=new ArrayList<>();

        public List<Feeder> getFeeder() {
            
             return feeder;
        }

        public void setFeeder(List<Feeder> feeder) {
             this.feeder = feeder;
        }

}

【问题讨论】:

    标签: javascript html jquery spring-boot spring-mvc


    【解决方案1】:
    1. 在页面加载时使用clone() 制作第一组的副本。添加新的时,我们会复制已存储的另一个
    2. 为组创建一个包装容器,使其更容易附加到
    3. 创建的函数adjustNames() 在添加或删除行时被调用。删除过程会取消对跟随它的名称的索引,因此似乎最安全的是通过它们。您可以看到文本输入名称设置为它们的值,以便在开发中进行验证

    tod​​o :如果删除所有行然后添加一个错误。如果只剩下一个,可能会阻止删除

    //group add limit
    var maxGroup = 5;
    
    var $groupContain = $('#group-container'); 
    
    // clone first group
    var $groupCopy = $groupContain.find('.fieldGroup').first().clone();
    $groupCopy.find(':input').val('') // clear any values if prepopulated
    
    //add more fields group
    $(".addMore").click(function() {
      var groupLen = $groupContain.find('.fieldGroup').length
      if (groupLen < maxGroup) {
        var $newGroup = $groupCopy.clone();
        $groupContain.append($newGroup);
        adjustNames()
      } else {
        alert('Maximum ' + maxGroup + ' groups are allowed.');
      }
    });
    
    function adjustNames(){
      // clear console for demo 
      $groupContain.find('.fieldGroup').each(function(i){
         var $inputs =   $(this).find(':input[name]');
         // uses the group index to update array names
         $inputs.attr('name', function(j, currName) {    
          return currName.replace(/\[\d+\]/, `[${i}]`);      
        });
        // for demo set names in text fields
        $inputs.filter(':text').val(function(){
           return this.name;
        });    
      });
    }
    
    //remove fields group
    $("body").on("click", ".remove", function() {
      $(this).parents(".fieldGroup").remove();
      adjustNames()
    });
    a{display:inline-block;padding:10px; font-size:1.2em}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    
    <form method="post" th:action="@{/addfeeder}" th:object="${feeder}">
      <div id="group-container">
        <div class="form-group fieldGroup">
          <div class="input-group mt-1 p-1 bg-light">
            <input type="text" name="feeder[0].feeder_name" class="form-control" placeholder="Enter Feeder name" />
            <select name="feeder[0].feeder_type" class="custom-select" id="inputGroupSelect01">
              <option selected>Choose Capacity</option>
              <option value="11">11</option>
              <option value="33">33</option>
            </select>
            <input type="text" name="feeder[0].no_of_consumer_in_the_feeder" class="form-control" placeholder="Total Consumers" />        
            <button class="remove"> Remove </button>
          </div>
        </div>
      </div>
      <div class="input-group-addon">
        <a href="javascript:void(0)" class="btn btn-success addMore"><span class="glyphicon glyphicon glyphicon-plus" aria-hidden="true"></span> Add</a>
      </div>
      </div>
      <!--<input type="submit" name="submit" class="btn btn-primary" value="SUBMIT" />-->
    </form>

    【讨论】:

    • 非常感谢,这正是我想要的。但是由于某种原因,添加按钮不起作用,当我单击添加按钮时没有任何反应,删除按钮似乎工作正常。
    • 您是否将其复制到克隆中?我确保 add 在该行之外,因为它最初被复制到其中并具有多个“Add”。如果这是你想要的,你需要委托事件监听器
    • 不,我的意思是,我在这里可能听起来超级愚蠢,但是当我运行它时,代码似乎在这里完美运行(运行代码 sn-p),但是当我将它复制到我的页面上时,添加按钮似乎没有做任何事情。
    • OK 尝试加回 $(document).ready(function(){ 。我删除了它,因为堆栈 sn-ps 不需要它,因为脚本是在 html 之后加载的
    猜你喜欢
    • 2010-10-13
    • 2020-08-06
    • 1970-01-01
    • 2015-09-11
    • 2015-12-12
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多