简体   繁体   中英

How to dynamically add rows to a form in html when i click on add row button?

<div class="row">
    <div class="col-md-4">
        <div class="form-group label-floating">
            <label class="control-label">Act</label>
            <input type="text" class="form-control" v-model="act" >
        </div>
    </div>
    <div class="col-md-4">
        <div class="form-group label-floating">
            <label class="control-label">Section </label>
            <input type="text" class="form-control" v-model="section">
        </div>
    </div>
    <button>Add row</button>
</div>

So, when I click on add button, i need to keep on adding the above row. How can I able to add this row when I click on add row button.

I need to pass values as BOOKED UNDER:

[{
    act :,
    section:,
}]

If I have more rows i need to pass values as comma seperated. I am weak in js and this is my first project having this kind of problem. How can I able to add values in this way.

My vue.js code is

addForm = new Vue({
    el: "#addForm",
    data: {
        bookedUnder:[],
        act: '',
        section:'',
    },
    methods: {
        handleSubmit: function(e) {
            var vm = this;
            data['otherNatureofOffense'] = //in the abve way
            $.ajax({
                url: 'http://localhost:3000/record/add/f/',
                data: data,
                type: "POST",
                dataType: 'json',
                success: function(e) {
                    if (e.status) {
                        vm.response = e;
                        alert("success")
                    } else {
                        vm.response = e;
                        console.log(vm.response);
                        alert(" Failed") 
                    }
                }
            });
            return false;
        }, 
    },
});

Please help me to have a solution

Try please,

 document.getElementById("clickMe").onclick = function () { //first div var newDivCol = document.createElement("div"); newDivCol.setAttribute("class","col-md-4"); //second div var newDivForm = document.createElement("div"); newDivForm.setAttribute("class","form-group label-floating"); newDivCol.appendChild(newDivForm); //label var newlabel = document.createElement("label"); newlabel.setAttribute("class","control-label"); newlabel.innerHTML = "Here goes the text"; newDivForm.appendChild(newlabel); //input var newInput = document.createElement("input"); newInput.setAttribute("type","text"); newInput.setAttribute("class","form-control"); newInput.setAttribute("v-model","act"); newDivForm.appendChild(newInput); var element = document.getElementById("addRowsHere"); element.appendChild(newDivCol); }; 
 <div class="row" id="addRowsHere"> <div class="col-md-4"> <div class="form-group label-floating"> <label class="control-label">Act</label> <input type="text" class="form-control" v-model="act" > </div> </div> <div class="col-md-4"> <div class="form-group label-floating"> <label class="control-label">Section </label> <input type="text" class="form-control" v-model="section"> </div> </div> </div> <button id="clickMe">Add row</button> 

https://jsfiddle.net/kkyunLzg/2/#

If you use pure javascript this may helpful

 var count=1; $("#btn").click(function(){ $("#container").append(addNewRow(count)); count++; }); function addNewRow(count){ var newrow='<div class="row">'+ '<div class="col-md-4">'+ '<div class="form-group label-floating">'+ '<label class="control-label">Act '+count+'</label>'+ '<input type="text" class="form-control" v-model="act" >'+ '</div>'+ '</div>'+ '<div class="col-md-4">'+ '<div class="form-group label-floating">'+ '<label class="control-label">Section '+count+'</label>'+ '<input type="text" class="form-control" v-model="section">'+ '</div>'+ '</div>'+ '</div>'; return newrow; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/> <div id="container"> <div class="row"> <div class="col-md-4"> <div class="form-group label-floating"> <label class="control-label">Act</label> <input type="text" class="form-control" v-model="act" > </div> </div> <div class="col-md-4"> <div class="form-group label-floating"> <label class="control-label">Section </label> <input type="text" class="form-control" v-model="section"> </div> </div> </div> </div> <button id="btn">Add row</button> 

You need to v-for the fields first then post the model like this:

<div class="row" v-for="(book, index) in bookedUnder" :key="index">
    <div class="col-md-4">
        <div class="form-group label-floating">
            <label class="control-label">Act {{index}}</label>
            <input type="text" class="form-control" v-model="book.act" >
        </div>
    </div>
    <div class="col-md-4">
        <div class="form-group label-floating">
            <label class="control-label">Section {{index}}</label>
            <input type="text" class="form-control" v-model="book.section">
        </div>
    </div>

</div>
<button @click="addNewRow">Add row</button>



addForm = new Vue({
    el: "#addForm",
    data: {
        bookedUnder:[
          {
             act: null,
             section: null,
          },
        ],
    },
    methods: {
        addNewRow: function() {
          this.bookedUnder.push({ act: null, section: null, });
        },
        handleSubmit: function(e) {
            var vm = this;
            $.ajax({
                url: 'http://localhost:3000/record/add/f/',
                data: vm.bookedUnder,
                type: "POST",
                dataType: 'json',
                success: function(e) {
                    if (e.status) {
                        vm.response = e;
                        alert("success")
                    } else {
                        vm.response = e;
                        console.log(vm.response);
                        alert(" Failed") 
                    }
                }
            });
            return false;
        }, 
    },
});

Depending on the typ of row you want to add there are different solutions.

If you want to add 'Section'-rows only, you could use an v-for in Vue and push a object to the array connected to the v-for:

Template:

<div class="col-md-4" v-for="(row, index) in rows" :key="index">
  <div class="form-group label-floating">
    <label class="control-label">Section </label>
    <input type="text" class="form-control" v-model="row.section">
  </div>
</div>
<button @click="addRow">
  Add Row
</button>

JS:

 data: {
   rows: [],
   defaultRow: {
     section: 'new-row'
   }
 },
 methods: {
   addRow() {
     // Clone the default row object
     this.rows.push(Object.assign({}, this.defaultRow))
   }
 }

If you want to add different types of rows you'll either have to create vue-components and add those, or get creative with different defaultRows (like maybe adding different types for different input).

 var count=1; $("#btn").click(function(){ $("#container").append(addNewRow(count)); count++; }); function addNewRow(count){ var newrow='<div class="row">'+ '<div class="col-md-4">'+ '<div class="form-group label-floating">'+ '<label class="control-label">Act '+count+'</label>'+ '<input type="text" class="form-control" v-model="act" >'+ '</div>'+ '</div>'+ '<div class="col-md-4">'+ '<div class="form-group label-floating">'+ '<label class="control-label">Section '+count+'</label>'+ '<input type="text" class="form-control" v-model="section">'+ '</div>'+ '</div>'+ '</div>'; return newrow; }
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/> <div id="container"> <div class="row"> <div class="col-md-4"> <div class="form-group label-floating"> <label class="control-label">Act</label> <input type="text" class="form-control" v-model="act" > </div> </div> <div class="col-md-4"> <div class="form-group label-floating"> <label class="control-label">Section </label> <input type="text" class="form-control" v-model="section"> </div> </div> </div> </div> <button id="btn">Add row</button>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM