knockout-sortable icon indicating copy to clipboard operation
knockout-sortable copied to clipboard

doesn't work properly with virtual element on ko 2.2

Open kazrac opened this issue 12 years ago • 4 comments

For sortable I use div as container and divs as items. I also tried table and trs. In template I use ko virtual element and if binding to show or hide some content depending on viewModel data. It breaks on knockout.2.2.js on line 546 if initial value of property which is bound to 'if' binding is false. Everything works file if initial value is true. I made simple example in jsFiddle.net. Try to change Task's Active to true for both items. It worked with fine with ko 2.1

http://jsfiddle.net/Shv5t/1/

kazrac avatar Dec 13 '12 11:12 kazrac

@kazrac - the sortable plugin expects that the sortable items will be contained in a single element. If you wrap your template in a div, then it would work properly. Sample: http://jsfiddle.net/rniemeyer/2qp4V/

Does that work for you or maybe you can explain your scenario a bit more, so I can see how to make it work properly?

rniemeyer avatar Dec 13 '12 15:12 rniemeyer

hi, thanks for quick answer. In project I use table and table rows instead of divs. There is one row for main information and one row for details. Details row can by expanded by clicking + in main row. It looks something like this http://jsfiddle.net/KSSDX/2/ . We tried to place 'if' binding inside second details tr but then sorting doesn't work properly in IE8. It is logical to have single contained element for sortable elements. In this case we prevent sorting when at least one row is expanded. Since it worked in older ko version it would be nice to have this functionality in new too :)

kazrac avatar Dec 13 '12 21:12 kazrac

Similar issue here: http://jsfiddle.net/benzor/3qQ4q/

It works in IE9, but not in IE8. Seems to be caused by fixUpNodesToBeMovedOrRemoved returning undefined. Not sure why but if all whitespace in the template is removed, it works in IE8 too.

bhandfast avatar Jan 02 '13 15:01 bhandfast

The cause is this bug in Knockout, SteveSanderson/knockout#498, which means that the afterRender callback gets stale data.

So why is there an error in 2.2 and not in 2.1? That's because the if binding saves the template differently in 2.2 than it does in 2.1. In 2.1, the nodes with if are saved as a template (original nodes are moved) and attached to a div. In 2.2, the nodes are copied and the original nodes are removed (so there's no parent). The error occurs because the sortable code assumes the nodes have a parent.

mbest avatar Jan 02 '13 20:01 mbest