2016-10-05 4 views
1

Ich verwende Sortable.js und Vue.js. Ziel ist es, Artikel zu sortieren und Daten auf dem neuesten Stand zu halten.Sortierbar.js mit falsch sortiertem Vue 2.0

Es funktionierte gut mit Vue 1.x, aber nach dem Update auf 2.0 wurde die Sortierung falsch. Das Array wird weiterhin ordnungsgemäß aktualisiert, aber die Objekte im DOM befinden sich an den falschen Stellen.

new Vue({ 
    el: '#app', 
    template: '#sort', 
    data: function() { 
    return { 
     items: [ 
     "http://placehold.it/200X300?text=image1", 
     "http://placehold.it/200X300?text=image2", 
     "http://placehold.it/200X300?text=image3", 
     "http://placehold.it/200X300?text=image4" 
     ], 
    } 
    }, 
    mounted: function() { 
    this.$nextTick(function() { 
     Sortable.create(document.getElementById('sortable'), { 
     animation: 200, 
     onUpdate: this.reorder.bind(this), 
     }); 
    }) 
    }, 
    methods: { 
    reorder: function(event) { 
     var oldIndex = event.oldIndex, 
      newIndex = event.newIndex; 
     this.items.splice(newIndex, 0, this.items.splice(oldIndex, 1)[0]); 

    } 
    } 
}); 

jsFiddle https://jsfiddle.net/4bvtofdd/4/

Kann mir jemand helfen?

+1

Ich fürchte sortierbar ist derzeit nicht kompatibel mit Vue 2.0 aufgrund der virtuellen Dom. Beide scheinen eine Inkompatibilität zu haben, wenn das DOM modifiziert wird. Der einzige mögliche "Patch", den ich sehe, ist, 2 Arrays zu verwenden, 1 für das Malen und den anderen, um die Änderungen zu verfolgen – ragnar

+0

Oh. Ich denke, ich muss dann ein anderes Plugin verwenden :( – sealla

Antwort

3

Während Sortable die Reihenfolge in sortable.toArray() verfolgt, ist es ziemlich einfach, eine Berechnung zu erstellen, die Ihnen die Elemente in sortierter Reihenfolge gibt, während die ursprüngliche Elementliste unverändert ist.

new Vue({ 
 
    el: '#app', 
 
    template: '#sort', 
 
    data: { 
 
    items: [ 
 
     "http://placehold.it/200X300?text=image1", 
 
     "http://placehold.it/200X300?text=image2", 
 
     "http://placehold.it/200X300?text=image3", 
 
     "http://placehold.it/200X300?text=image4" 
 
    ], 
 
    order: null 
 
    }, 
 
    computed: { 
 
    sortedItems: function() { 
 
     if (!this.order) { 
 
     \t return this.items; 
 
     } 
 
     return this.order.map((i) => this.items[i]); 
 
    } 
 
    }, 
 
    mounted: function() { 
 
    this.$nextTick(() => { 
 
     const sortable = Sortable.create(document.getElementById('sortable'), { 
 
     animation: 200, 
 
     onUpdate:() => { this.order = sortable.toArray(); } 
 
     }); 
 
    }) 
 
    } 
 
});
<script src="//cdnjs.cloudflare.com/ajax/libs/Sortable/1.4.2/Sortable.min.js"></script> 
 
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/> 
 
<script src="//unpkg.com/[email protected]/dist/vue.js"></script> 
 
<div id='app'></div> 
 
<template id="sort"> 
 
    <div class="container"> 
 
    <div class="row sort-wrap" id="sortable"> 
 
     <div class="col-xs-6 col-md-3 thumbnail" v-for="(item, index) in items" :data-id="index"> 
 
     <img v-bind:src="item" alt="" class="img-responsive"> 
 
     </div> 
 
    </div> 
 
    <div v-for="item in sortedItems"> 
 
    {{item}} 
 
    </div> 
 
    </div> 
 
</template>

4

ich heute ähnliches Problem hatte.

Anzahl: Schlüsselwert sicher Vue rerender Elemente in corrent Reihenfolge nach sortierbar Änderung Artikel

bestellen
<div v-for="item in items" :key="item.id"> 
    <!-- content --> 
</div> 

https://vuejs.org/v2/guide/list.html#key

0

Stellen Sie sicher, Sie sind nicht zu machen eine Stütze verwenden, oder Sie werden nicht sein in der Lage zu sortieren. Wenn Sie eine Requisite verwenden, weisen Sie die Prop-Daten einem Datenattribut zu und verwenden Sie stattdessen das Datenattribut.