1
votes

Suppression de la ligne sélectionnée dans la table de données Vuetify

J'utilise une table de données dans vuetify. J'utilise v-checkbox. Je souhaite supprimer l'élément sélectionné de la case à cocher v en cliquant sur un bouton. J'ai un bouton de suppression en bas du tableau de données. Ainsi, lorsqu'un utilisateur clique sur le bouton de suppression, la ligne sélectionnée dans la table de données doit être supprimée. Des idées sur la façon de procéder?

<template>
<div>

    <v-toolbar flat color="white">
      <v-toolbar-title>Manage Projects</v-toolbar-title>   
      {{ props }}
    </v-toolbar>
    
  <v-data-table
    v-model="props"
    :headers="headers"
    :items="projects"
    item-key="name"
    select-all
    class="elevation-1"
  >
    <template slot="items" slot-scope="props">
      <td>
        <v-checkbox
          v-model="props.selected"
          primary
          hide-details
        ></v-checkbox>
      </td>
      <td>{{ props.item.name }}</td>
      <td class="text-xs-left">{{ props.item.organisation }}</td>
      <td class="text-xs-left">{{ props.item.supplier }}</td>
      <td class="text-xs-left">{{ props.item.createdBy }}</td>
      <td class="text-xs-left">{{ props.item.updatedBy }}</td>
     
    </template>
  </v-data-table>

   <div class="text-xs-center pt-2">
      <v-btn color="primary" @click="deleteProject">Delete</v-btn>
      <v-btn color="primary" @click="liveProject">Make Live</v-btn>
       <v-btn color="primary" @click="closeProject">Close</v-btn>
       
       
    </div>
</div>

</template>
<script>
  export default {
    data () {
      return {
        props:[],
        selected: [],
        headers: [
          {
            text: 'Name',
            align: 'left',
            sortable: true,
            value: 'name'
          },
          { text: 'Organisation', value: 'organisation' },
          { text: 'Supplier', value: 'supplier' },
          { text: 'Created By', value: 'createdBy' },
          { text: 'Updated By', value: 'updatedBy' },
       
        ],
        projects: [
          {
            name: 'test',
            organisation: 'test',
            supplier: 'test',
            createdBy: 'test',
            updatedBy: 'test'
          },
          {
            name: 'Ice cream sandwich',
            calories: 237,
            fat: 9.0,
            carbs: 37,
            protein: 4.3,
            iron: '1%'
          },
          {
            name: 'Eclair',
            calories: 262,
            fat: 16.0,
            carbs: 23,
            protein: 6.0,
            iron: '7%'
          },
          {
            name: 'Cupcake',
            calories: 305,
            fat: 3.7,
            carbs: 67,
            protein: 4.3,
            iron: '8%'
          },
          {
            name: 'Gingerbread',
            calories: 356,
            fat: 16.0,
            carbs: 49,
            protein: 3.9,
            iron: '16%'
          },
          {
            name: 'Jelly bean',
            calories: 375,
            fat: 0.0,
            carbs: 94,
            protein: 0.0,
            iron: '0%'
          },
          {
            name: 'Lollipop',
            calories: 392,
            fat: 0.2,
            carbs: 98,
            protein: 0,
            iron: '2%'
          },
          {
            name: 'Honeycomb',
            calories: 408,
            fat: 3.2,
            carbs: 87,
            protein: 6.5,
            iron: '45%'
          },
          {
            name: 'Donut',
            calories: 452,
            fat: 25.0,
            carbs: 51,
            protein: 4.9,
            iron: '22%'
          },
          {
            name: 'KitKat',
            calories: 518,
            fat: 26.0,
            carbs: 65,
            protein: 7,
            iron: '6%'
          }
        ]
      }
    },

    methods: {
        deleteProject
        {
            // delete funtion here
        },

        liveProject()
        {
            alert("live");
        },

        closeProject()
        {
            alert("close");
        },
    }
  }
</script>


2 commentaires

Qu'obtenez-vous pour les accessoires sélectionnés? noms de projets?


Oui Nom du projet ainsi que d'autres informations dans la ligne


4 Réponses :


0
votes
deleteProject(item_name){
    this.projects.splice(this.projects.findIndex(e=> e.name == item_name),1)
}

// JS splice method for remove items from an array.
// JS findIndex method for find the index of the element which you want to delete. 

3 commentaires

Cela ne supprime pas la ligne sélectionnée. Ceci supprime une autre ligne.


Qu'entendez-vous par autre ligne?


Je veux dire qu'il ne supprime pas la ligne sélectionnée que je sélectionne dans la case à cocher



0
votes

J'ai eu un problème similaire hier mais avec jquery. Maintenant, avec vuejs, c'est en fait plus simple, je suppose, avec la liaison de modèle afin que toutes les lignes sélectionnées soient poussées vers une propriété de données. Ensuite, en cliquant sur Supprimer, parcourez tous les identifiants ou clés sélectionnés et supprimez-les de votre boutique ou en appelant une API backend ou votre propriété de données comme vous l'avez fait ici Par exemple

data: () => ({
    selected: [],
    projects: {/*...content in here */},
});

methods: {

   delete() {
       this.selected.forEach(function(project) { // project here is just the index of the selected in the projects array
           projects.splice(project, 1);
      });

      this.selected = []; // don't forget to empty selected
   }
}


0 commentaires

3
votes

Voici le code pour supprimer les lignes sélectionnées de votre table de données.

Consultez l'exemple ci-dessous.

Lien Codepen vers votre solution

Template=>

  new Vue({
  el: '#app',
  data () {
    return {
      selected: [],
      headers: [
        {
          text: 'Dessert (100g serving)',
          align: 'left',
          sortable: false,
          value: 'name'
        },
        { text: 'Calories', value: 'calories' },
        { text: 'Fat (g)', value: 'fat' },
        { text: 'Carbs (g)', value: 'carbs' },
        { text: 'Protein (g)', value: 'protein' },
        { text: 'Iron (%)', value: 'iron' }
      ],
      desserts: [
        {
          name: 'Frozen Yogurt',
          calories: 159,
          fat: 6.0,
          carbs: 24,
          protein: 4.0,
          iron: '1%'
        },
        {
          name: 'Ice cream sandwich',
          calories: 237,
          fat: 9.0,
          carbs: 37,
          protein: 4.3,
          iron: '1%'
        },
        {
          name: 'Eclair',
          calories: 262,
          fat: 16.0,
          carbs: 23,
          protein: 6.0,
          iron: '7%'
        },
        {
          name: 'Cupcake',
          calories: 305,
          fat: 3.7,
          carbs: 67,
          protein: 4.3,
          iron: '8%'
        },
        {
          name: 'Gingerbread',
          calories: 356,
          fat: 16.0,
          carbs: 49,
          protein: 3.9,
          iron: '16%'
        },
        {
          name: 'Jelly bean',
          calories: 375,
          fat: 0.0,
          carbs: 94,
          protein: 0.0,
          iron: '0%'
        },
        {
          name: 'Lollipop',
          calories: 392,
          fat: 0.2,
          carbs: 98,
          protein: 0,
          iron: '2%'
        },
        {
          name: 'Honeycomb',
          calories: 408,
          fat: 3.2,
          carbs: 87,
          protein: 6.5,
          iron: '45%'
        },
        {
          name: 'Donut',
          calories: 452,
          fat: 25.0,
          carbs: 51,
          protein: 4.9,
          iron: '22%'
        },
        {
          name: 'KitKat',
          calories: 518,
          fat: 26.0,
          carbs: 65,
          protein: 7,
          iron: '6%'
        }
      ]
    }
  },
  methods: {
   deleteItem () {
   if(confirm('Are you sure you want to delete this item?')){
  for(var i = 0; i <this.selected.length; i++){
      const index = this.desserts.indexOf(this.selected[i]);
      this.desserts.splice(index, 1);
  }
    }
   }
}
})

Script => p>

    <div id="app">
  <v-app id="inspire">
    <v-data-table
      v-model="selected"
      :headers="headers"
      :items="desserts"
      item-key="name"
      select-all
      class="elevation-1"
    >
      <template slot="items" slot-scope="props">
        <td>
          <v-checkbox
            v-model="props.selected"
            primary
            hide-details
          ></v-checkbox>
        </td>
        <td>{{ props.item.name }}</td>
        <td class="text-xs-right">{{ props.item.calories }}</td>
        <td class="text-xs-right">{{ props.item.fat }}</td>
        <td class="text-xs-right">{{ props.item.carbs }}</td>
        <td class="text-xs-right">{{ props.item.protein }}</td>
        <td class="text-xs-right">{{ props.item.iron }}</td>
      </template>
    </v-data-table>
    <div>
      <v-btn color="primary" @click="deleteItem">Delete</v-btn>
    </div>
  </v-app>
</div>


10 commentaires

Et si plutôt qu'une boîte de confirmation, nous devons mettre une boîte de dialogue. Où l'ajoutons-nous?


Vous pouvez le remplacer si (confirmez ('Êtes-vous sûr de vouloir supprimer cet élément?')) Par n'importe quel type d'alerte ou de dialogue que vous souhaitez.


Faut-il simplement ajouter un v-dialog au lieu d'un v-btn?


J'ai ajouté une boîte de dialogue de base pour vous, vous pouvez la modifier à votre guise. codepen.io/anon/pen/pYzZPZ?editors=1010


cela fonctionne bien mais la boîte de dialogue ne se ferme pas d'elle-même une fois que nous supprimons un élément.


Oui oui ça l'est. J'ai essayé d'inclure un bouton supplémentaire dans la boîte de dialogue pour aucune option. Non ​​Je voulais fermer la boîte de dialogue lorsqu'un utilisateur appuie sur Non. Mais pour une raison quelconque, cela ne fonctionne pas


Assurez-vous que votre v-btn est à l'intérieur de v-dialog. De plus, j'ai besoin du code pour vérifier. Téléchargez un lien vers codepen si possible.


Merci beaucoup pour votre aide. Je ne déclarais pas de dialogue dans les données. C'est pourquoi ça ne fonctionnait pas


existe-t-il un moyen d'activer le bouton uniquement lorsque nous avons sélectionné une ligne? Sinon, le bouton doit rester désactivé


Il vous suffit d'ajouter ceci: disabled = "selected.length == 0" dans la balise v-dialog. Voici la solution mise à jour. codepen.io/anon/pen/pYzZPZ?editors=1010



0
votes

Si le Table de données est lié au tableau d'objets d'un magasin :


Nous pouvons également utiliser map pour obtenir l ' index de l'objet dans un tableau de stockage et le supprimer en utilisant:

REMOVE_OBJECT_FROM_ARRAY: (état, charge utile) => { let i = state.someArrayofObjects.map (item => item.id) .indexOf (payload.id); state.someArrayofObjects.splice (i, 1); }

Ici, l ' id est l'identifiant passé avec la charge utile à la MUTATION , on peut aussi transmettre uniquement le id dans son ensemble < code> charge utile . Dans ce cas, nous pouvons faire quelque chose comme:

REMOVE_OBJECT_FROM_ARRAY: (état, charge utile) => { let i = state.someArrayofObjects.map (item => item.id) .indexOf (payload); state.someArrayofObjects.splice (i, 1); }


0 commentaires