2016-05-30 7 views
2

Ich versuche, eine sortierbare Liste in Vue.js zu binden, aber die zugrunde liegenden Datenliste nicht aktualisiert wird:Wie binden Sie eine sortierbare Liste an vuejs?

Vue.component('lessons', { 
 
    template: "#lessons-template", 
 

 
    data: function() { 
 
    return { 
 
     list: ['Item 1', 'Item 2', 'Item 3'] 
 
    }; 
 
    }, 
 

 
    methods: { 
 
    onChange: function(evt) { 
 
     console.log(this.list); // allways ['Item 1', 'Item 2', 'Item 3'] 
 
    } 
 
    }, 
 

 
    ready: function(value) { 
 
    Sortable.create(this.$els.sortable, { 
 
     draggable: 'li', 
 
     onSort: this.onChange 
 
    }); 
 
    } 
 
}); 
 

 
new Vue({ el: 'body'});
ul { list-style: none;} 
 
ul li { padding: 10px; display: block; background: #EFEFEF; margin-bottom: 5px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.16/vue.js"></script> 
 
<script src="http://rubaxa.github.io/Sortable/Sortable.js"></script> 
 

 
    <div> 
 
    <lessons></lessons> 
 
    </div> 
 

 
    <template id="lessons-template"> 
 

 
    <ul v-el:sortable> 
 
     <li v-for="item in list">{{ item }}</li> 
 
    </ul> 
 
    
 
    <pre>{{ list | json }}</pre> 
 
    </template>

Antwort

4

Hier gehen wir:

Vue.js:

Vue.component('lessons', { 
    template: "#lessons-template", 

    data: function() { 
    return { 
     list: ['Item 1', 'Item 2', 'Item 3'] 
    }; 
    }, 

    methods: { 
    onChange: function(evt) { 
     console.log(this.list); // allways ['Item 1', 'Item 2', 'Item 3'] 
    } 
    }, 

    ready: function(value) { 
    var self = this; 
    Sortable.create(this.$els.sortable, { 
     draggable: 'li', 
     onSort: this.onChange, 
     onEnd: function (evt) { 
     self.list.splice(evt.oldIndex,1); 
     self.list.splice(evt.newIndex,0,evt.item.id);  
    }, 
    }); 
    } 
}); 

new Vue({ el: 'body'}); 

HTML:

<div> 
    <lessons></lessons> 
</div> 

<template id="lessons-template"> 
    <ul v-el:sortable> 
    <li v-for="item in list" id="{{item}}">{{ item }}</li> 
    </ul> 
</template> 

Arbeits Vue.js Sortable jsFiddle: https://jsfiddle.net/crabbly/vhsd3wwu/

+0

Mann, sehr cool. –

+0

Ich habe ein Problem, wo es sich verhält, als ob es nicht gebunden ist, wenn ich es ziehe und erst gebunden wird, nachdem ich das Objekt losgelassen habe. Das ist ein Problem für mich, weil ich AJAX-Anrufe im Hintergrund mache und wenn ich ein Update bekomme Vue fügt ein neues Element ein, dann habe ich Duplikate –

+0

@ ErikBerkun-Drevnig Sie müssen etwas falsch mit Ihren Ajax-Anrufen tun, oder am wahrscheinlichsten , wo oder wo du sie führst. Im Grunde würden Sie Ihren Ajax-Anruf auf Update ausführen, sonst hat sich nichts geändert, und es gibt keine Notwendigkeit für Anrufe. Das sollte ziemlich geradlinig sein. Wenn Sie eine Geige erstellen, die Ihr Szenario repliziert, kann ich das Problem wahrscheinlich für Sie identifizieren. – crabbly

Verwandte Themen