Skip to content

Commit 9f3ce34

Browse files
author
pc-david\david.desmaisons
committed
Work in progess: first fix for bug when mixing v-if and track by index
1 parent 2f38d3b commit 9f3ce34

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

examples/Two_Lists_Clone_If.html

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,26 @@ <h1>Vue Dragable For</h1>
1717
<div class="drag">
1818
<h2>List 1 v-dragable-for</h2>
1919
<div id="list1" class="dragArea" >
20-
<div v-dragable-for="element in list1" options='{"group":{ "name":"people", "pull":"clone","put":false}}' v-if="element.id > 2">
21-
{{element.name}}
20+
<div v-dragable-for="element in list1" options='{"group":{ "name":"people", "pull":"clone","put":false}}' v-if="element.id > 2" track-by="$index">
21+
{{element.name}}, id: {{element.id}}
2222
</div>
2323
</div>
2424

2525
<h2>List 2 v-dragable-for</h2>
2626
<div id="list2" class="dragArea">
27-
<div v-dragable-for="element in list2" options='{"group":"people"}' track-by="$index">{{element.name}}</div>
28-
<!-- -->
27+
<div v-dragable-for="element in list2" options='{"group":"people"}' track-by="$index" v-if="element.id > 3">{{element.name}}, id: {{element.id}}</div>
2928
</div>
3029
</div>
3130

3231
<div class="normal">
3332
<h2>List 1 v-for</h2>
3433
<div>
35-
<div v-for="element in list1" track-by="$index">{{element.name}}</div>
34+
<div v-for="element in list1" track-by="$index">{{element.name}} {{$index}}</div>
3635
</div>
3736

3837
<h2>List 2 v-for</h2>
3938
<div>
40-
<div v-for="element in list2" track-by="$index">{{element.name}}</div>
39+
<div v-for="element in list2" track-by="$index">{{element.name}} {{$index}}</div>
4140
</div>
4241
</div>
4342

src/vuedragablefor.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,37 +69,43 @@
6969
options = _.merge(options,{
7070
onStart: function (evt) {
7171
indexes = computeIndexes(_.chain(evt.from.children));
72+
console.log(indexes);
7273
},
7374
onUpdate: function (evt) {
75+
if (ctx.params.trackBy==="$index"){
76+
removeNode(evt.item);
77+
insertNodeAt(evt.from, evt.item, evt.oldIndex);
78+
}
7479
updatePosition(ctx.collection, evt.newIndex, evt.oldIndex);
7580
},
76-
onAdd: function (evt) {
77-
indexes = computeIndexes(_.chain(evt.to.children).filter(function(elt){return elt!==evt.item;}));
78-
console.log(indexes);
79-
if (!!ctx.collection){
81+
onAdd: function (evt) {
82+
if (!!ctx.collection){
8083
var addElement= getVmObject(evt.item);
81-
var length = indexes.length;
84+
var localIndexes = computeIndexes(_.chain(evt.to.children).filter(function(elt){return elt!==evt.item;}));
85+
var length = localIndexes.length;
8286
if (evt.newIndex>= length){
8387
ctx.collection.push(addElement);
8488
}
8589
else{
86-
var newIndex = indexes[evt.newIndex];
90+
var newIndex = localIndexes[evt.newIndex];
8791
ctx.collection.splice(newIndex, 0, addElement);
8892
}
8993
}
9094
},
9195
onRemove: function (evt) {
9296
var collection = ctx.collection;
93-
if (!!collection && !evt.clone){
97+
var isCloning = !!evt.clone;
98+
if (!!collection && !isCloning){
99+
//If is cloning is set no need to remove element from collection
94100
var realOld = indexes[evt.oldIndex];
95101
collection.splice(realOld, 1);
96102
}
97-
if (!!evt.clone){
103+
if (isCloning){
98104
removeNode(evt.clone);
99-
insertNodeAt(evt.from, evt.item, evt.oldIndex)
105+
insertNodeAt(evt.from, evt.item, evt.oldIndex);
100106
}
101107
else{
102-
//remove added node: Vue will add it for us
108+
//Need to remove added node if Vue is not tracking it: Vue will add it for us
103109
var elt = evt.item
104110
if (!!getFragment(elt).parentFrag){
105111
removeNode(elt);

0 commit comments

Comments
 (0)