2017-08-15 2 views
0

Ich versuche vue.draggable in mein Projekt zu integrieren https://github.com/SortableJS/Vue.DraggableWie Vue.Draggable in meine Komponenten integrieren

Ich bin ein wenig verwirrt, wie mein bestehendes Projekt mit Vue.draggable zu integrieren. Ich möchte, dass jedes in der v-for-Schleife erstellte Element ziehbar ist. Ich bin es gewohnt, jQuery UI zu verwenden, um dies zu erreichen, aber natürlich möchte ich einen vue-zentrierten Ansatz.

Was ist der beste Weg, dies zu tun?

var height = $(document).height(); 
 
var width = $(document).width(); 
 
$(function() { 
 
    Vue.component('sidebar', { 
 
    data:() => { 
 
     return { 
 
     people: [] 
 
     } 
 
    }, 
 
    template: ` 
 
       <div id="sidebar"> 
 
        <div v-for="person in people" :class="[{'checked-in': isCheckedIn(person)}, 'person']" :id="person.id"> 
 
         {{person.first_name + ' ' + person.last_name}} 
 
        </div> 
 
       </div> 
 
      `, 
 
    methods: { 
 
     isCheckedIn(person) { 
 
     return person.reg_scan == null ? true : false; 
 
     }, 
 
     loadPeople() { 
 
     $.ajax({ 
 
      method: 'POST', 
 
      dataType: 'json', 
 
      url: base_url + 'users/getParticipants/' + event_id 
 
     }).done(data => { 
 
      this.people = data; 
 
     }); 
 
     } 
 
    }, 
 
    mounted() { 
 
     this.loadPeople(); 
 
     setInterval(() => { 
 
     console.log("Getting People"); 
 
     this.loadPeople(); 
 
     }, 10000); 
 
    } 
 
    }); 
 

 

 
    Vue.component('tables', { 
 
    data:() => { 
 
     return { 
 
     tables: [] 
 
     } 
 
    }, 
 
    template: ` 
 
       <div id="tables"> 
 
        <div class='table' v-for="table in tables" :style="computeOffsets(table)"> 
 
         {{table.name}} 
 
        </div> 
 
       </div> 
 
      `, 
 
    methods: { 
 
     loadTables() { 
 
     $.ajax({ 
 
      method: 'POST', 
 
      dataType: 'json', 
 
      url: base_url + 'tables/getTables/' + event_id 
 
     }).done(data => { 
 
      this.tables = data; 
 
     }); 
 
     }, 
 
     computeOffsets(table) { 
 
     return { 
 
      top: (table.position_x * width) + 'px', 
 
      left: (table.position_y * height) + 'px' 
 
     } 
 
     } 
 
    }, 
 
    mounted() { 
 
     this.loadTables(); 
 
     setInterval(() => { 
 
     console.log("Getting Tables"); 
 
     this.loadTables(); 
 
     }, 10000); 
 
    } 
 
    }); 
 

 
    var app = new Vue({ 
 
    el: '#main' 
 
    }); 
 

 
});
.table { 
 
    position: absolute; 
 
} 
 

 
#sidebar { 
 
    width: 10%; 
 
    float: left; 
 
    height: 500px; 
 
    overflow-y: scroll; 
 
} 
 

 
.checked-in { 
 
    background-color: lightgreen; 
 
}
<head> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/Sortable/1.6.0/Sortable.min.js"></script> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/Vue.Draggable/2.14.1/vuedraggable.min.js"></script> 
 
</head> 
 
<div id="main"> 
 
    <sidebar></sidebar> 
 
    <tables></tables> 
 
</div>

+0

Werfen Sie einen Blick auf vue-dragula :) Es war ein Knaller für mich zu verwenden. –

Antwort

1

Wechsel:

<div id="sidebar"> 
    <div v-for="person in people" :class="[{'checked-in': isCheckedIn(person)}, 'person']" :id="person.id"> 
    {{person.first_name + ' ' + person.last_name}} 
    </div> 
</div> 

An:

<draggable :list="people"> 
    <div v-for="person in people" :class="[{'checked-in': isCheckedIn(person)}, 'person']" :key="person.id"> 
    {{person.first_name + ' ' + person.last_name}} 
    </div> 
</draggable > 
Verwandte Themen