2017-10-17 2 views
0

Je calcule le coût estimé. Sélectionner un produit récupère les détails du produit et affiche sa description et son prix dans la zone de saisie. Et puis en cliquant sur le bouton ajouter une nouvelle ligne apparaîtra pour une autre sélection. Mais le problème est que la nouvelle ligne apparaît avec les anciennes données de ligne. Et changer une seule ligne affecte toutes les autres lignes. Voici mon code jusqu'à présent:Sélection d'une seule ligne Sélection de toutes les autres lignes dans Vue.js

    <tbody v-for="row in rows" :key="index"> 
         <tr> 
          <td> 
         <select @change="selected" v-model="product_id" class="form-control" name="product_id" id="product_id"> 
          <option value="">Select Product</option> 
          <option v-for="item in items" :value="item.id" v-text="item.product_name"></option> 
         </select>           
          </td> 
          <td> 
           <textarea type="text" v-model="product.product_details" name="product_details" id="product_details" class="form-control" rows="1" placeholder="Product Details"> 
           </textarea> 
          </td> 
          <td> 
           <input v-model.number="product.product_sellPrice" type="number" step="any" class="form-control" name="rate" id="rate" placeholder="Rate"> 
          </td> 
          <td> 
           <input v-model.number="product.product_tax" type="number" step="any" class="form-control" name="tax" id="tax" placeholder="Tax"> 
          </td> 
          <td> 
           <input v-model="quantity" type="number" class="form-control" name="quantity" id="quantity" placeholder="Quantity"> 
          </td> 

          <td> 
           <input :value="total" type="number" step="any" class="form-control" name="total" id="total" placeholder="Total Price"> 
          </td> 
          <td> 
           <button class="btn btn-secondary" v-on:click="addrow" > 
            <i class="fa fa-plus" aria-hidden="true"></i> 
           </button> 
           <button v-show="length > 1" class="btn btn-secondary" @click.prevent="removerow(index)"> 
            <i class="fa fa-minus" aria-hidden="true"></i> 
           </button> 
          </td> 
         </tr> 
        </tbody> 


<script> 
    export default{ 
     props: ['products'], 

     data() { 

      return { 
       rows: [{ 

       }], 

       items: this.products, 
       product: '', 
       product_id: '', 
       quantity: '', 
       index: '', 
       total_price: '', 
      } 
     }, 


     methods: { 
      addrow: function (event) { 
       event.preventDefault(); 
       this.rows.push({ 
       }); 
      }, 

      removerow: function (index) { 
       this.rows.splice(index, 1); 
      }, 

      selected(e){ 
       var id = this.product_id; 
       console.log(id); 
       axios.get('/estimate/product/' + id) 
        .then((response)=>{ 
         this.product = ''; 
         this.product = response.data; 
        }) 
        .catch((error) => { 
         console.log(error); 
        }); 
      }, 
     } 
    } 
</script> 

Où est-ce que je fais mal? Comment puis-je le résoudre? Merci.

+0

C'est une seule partie de mon projet. Mais je pense qu'il n'a pas d'autre connexion sans aller chercher les données de la base de données avec le projet. Voici mon code complet pour cette partie et je pense que je me trompe dans la sélection des lignes –

+0

Obtenir le code de fonctionnement de travail dans jsfiddle.net et de poster ici, il sera plus facile de vous aider .. Comment créer un minimum, complet et vérifiable exemple: https://stackoverflow.com/help/mcve – StefanE

+0

Cela ne fonctionnera pas dans JSFiddle. Mais j'ai rendu le code plus court. –

Répondre

1

key doit être un identifiant unique pour chaque ligne. Vous avez index défini dans l'objet data et vous l'utilisez pour toutes les lignes comme clé, ce qui provoque des problèmes.

De même, il n'est pas recommandé d'utiliser l'index de ligne comme clé car il change lorsque vous ajoutez/supprimez des lignes.

Vous avez donc besoin d'ajouter un certain identifiant à chaque élément de ligne et l'utiliser comme la clé, voici un exemple simple de la façon de le faire:

<div id="vue-instance"> 
    <ul> 
    <li v-for="(index,item) in inventory" :key="item.name"> 
     {{ item.name }} - ${{ item.price }} 
     <button @click="add">Add</button> 
     <button @click="remove(index)">Remove</button> 
    </li> 
    </ul> 


</div> 

var vm = new Vue({ 
    el: '#vue-instance', 
    data: { 
    counter: 1, 
    inventory: [{ 
     name: 'MacBook Air', 
     price: 1000 
    }, { 
     name: 'MacBook Pro', 
     price: 1800 
    }, { 
     name: 'Lenovo W530', 
     price: 1400 
    }, { 
     name: 'Acer Aspire One', 
     price: 300 
    }] 
    }, 
    methods: { 
    add: function() { 
     this.inventory.push({ 
     name: 'item' + this.counter++, 
     price: this.counter * 1000 
     }) 
    }, 
    remove: function(index) { 
     this.inventory.splice(index, 1); 
    } 
    } 
}); 

https://jsfiddle.net/1rancd5g/

+0

Merci pour votre réponse. Je sais comme tu l'as fait. Mais la chose est que j'ai l'option de sélection et lors de la sélection d'un élément, j'envoie une requête axios pour obtenir la propriété de l'élément. i –

+0

Le nouveau code est comme ceci à partir de votre suggestion: https://jsfiddle.net/5phq111c/2/ Mais le problème reste tout de même. Où est le problème dans le code? –

+0

Le nouveau code que vous avez publié a le même problème, vous utilisez pour la clé 'row.id', mais la ligne n'a pas d'ID. ajoutez une propriété id à la ligne. Vous pouvez rechercher ici comment générer un ID: https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript – Tomer