Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vuejs: v-model array in multiple input

Tags:

arrays

vue.js

I have an input text field with a v-model attached, and every time someone hits the "Add" button, another input text get added to the DOM with the same v-model attached. I thought I'd then get an array of the v-model values, but it only gets the value of the first v-model input:

<div id="app">
  <div id="references">
    <input v-model="references" type="text">
  </div>
  <button @click="addReference">Add</button>
</div>

The html I append to the dom is triggered by the addReference method:

addReference: function(e) {
  e.preventDefault();
  console.log(this.references);
  var inputEl = '<input v-model="references" type="text">';
  $('#references').append(inputEl);
}

Is this something Vuejs can't do? Is there a different approach of gathering values from dynamic dom elements with Vuejs?

new Vue({
  el: "#app",
  data: {
    references: "text"
  },
  methods: {
    addReference: function(e) {
      e.preventDefault();
      console.log(this.references);
      var inputEl = '<input v-model="references" type="text">';
      $('#references').append(inputEl);
    }
  }
})
input {
  display: block;
  margin: 1px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="app">
  <div id="references">
    <input v-model="references" type="text">
  </div>
  <button @click="addReference">Add</button>
</div>
like image 473
jlos Avatar asked Jan 16 '16 08:01

jlos


3 Answers

You're thinking through DOM, it's a hard as hell habit to break. Vue recommends you approach it data first.

It's kind of hard to tell in your exact situation but I'd probably use a v-for and make an array of finds to push to as I need more.

Here's how I'd set up my instance:

new Vue({   el: '#app',   data: {     finds: []   },   methods: {     addFind: function () {       this.finds.push({ value: '' });     }   } }); 

And here's how I'd set up my template:

<div id="app">   <h1>Finds</h1>   <div v-for="(find, index) in finds">     <input v-model="find.value" :key="index">   </div>   <button @click="addFind">     New Find   </button> </div> 

Although, I'd try to use something besides an index for the key.

Here's a demo of the above: https://jsfiddle.net/crswll/24txy506/9/

like image 195
Bill Criswell Avatar answered Sep 29 '22 03:09

Bill Criswell


If you were asking how to do it in vue2 and make options to insert and delete it, please, have a look an js fiddle

new Vue({    el: '#app',    data: {      finds: []     },    methods: {      addFind: function () {        this.finds.push({ value: 'def' });      },      deleteFind: function (index) {        console.log(index);        console.log(this.finds);        this.finds.splice(index, 1);      }    }  });
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script>  <div id="app">    <h1>Finds</h1>    <div v-for="(find, index) in finds">      <input v-model="find.value">      <button @click="deleteFind(index)">        delete      </button>    </div>        <button @click="addFind">      New Find    </button>        <pre>{{ $data }}</pre>  </div>
like image 34
Yevgeniy Afanasyev Avatar answered Sep 29 '22 05:09

Yevgeniy Afanasyev


Here's a demo of the above:https://jsfiddle.net/sajadweb/mjnyLm0q/11

new Vue({
  el: '#app',
  data: {
    users: [{ name: 'sajadweb',email:'[email protected]' }] 
  },
  methods: {
    addUser: function () {
      this.users.push({ name: '',email:'' });
    },
    deleteUser: function (index) {
      console.log(index);
      console.log(this.finds);
      this.users.splice(index, 1);
      if(index===0)
      this.addUser()
    }
  }
});
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app">
  <h1>Add user</h1>
  <div v-for="(user, index) in users">
    <input v-model="user.name">
    <input v-model="user.email">
    <button @click="deleteUser(index)">
      delete
    </button>
  </div>
  
  <button @click="addUser">
    New User
  </button>
  
  <pre>{{ $data }}</pre>
</div>
like image 24
sajjad Avatar answered Sep 29 '22 03:09

sajjad