Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>For those (like me) who need a SSCCE working; the solution follow's [cybermotron] suggestion, also fixes an issue where handlers expect prarameters <em>data</em> and <em>event</em>.</p> <p><a href="http://jsfiddle.net/marrok/m63aJ/" rel="nofollow">http://jsfiddle.net/marrok/m63aJ/</a></p> <p>HTML</p> <pre><code>&lt;script type="application/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"&gt;&lt;/script&gt; &lt;ul id="people" data-bind='template: { name: "personTmpl", foreach: people }'&gt; &lt;/ul&gt; &lt;div class="trash" data-bind ="visible:dragging, event:{ dragover: function(data, event){ event.preventDefault(); }, drop: function(data, event){ console.log('trash', $root.drag_start_index()) $root.trash($root.drag_start_index()) event.preventDefault(); } }"&gt; &lt;span&gt;DELETE&lt;/span&gt; &lt;/div&gt; &lt;script id="personTmpl" type="text/html"&gt; &lt;li class="draggable" draggable="true" data-bind="event:{ dragstart: function(data, event){ $(event.target).addClass('dragSource') $root.drag_start_index($index()); return $(event.target).hasClass('draggable');}, dragend: function(data, event){ $root.drag_start_index(-1); $(event.target).removeClass('dragSource') return true; }, dragover: function(data, event){event.preventDefault();}, dragenter: function(data, event){ $root.drag_target_index($index()); var element = $(event.target) if(element.hasClass('draggable')) element.toggleClass('dragover'); event.preventDefault(); }, dragleave: function(data, event, $index){ var element = $(event.target) if(element.hasClass('draggable')) element.toggleClass('dragover'); event.preventDefault(); }, drop: function(data, event){ $(event.target).removeClass('dragover'); console.log('swap', $root.drag_start_index(), $root.drag_target_index() ) $root.swap($root.drag_start_index(), $root.drag_target_index()) } }"&gt; &lt;span data-bind='text: name'&gt;&lt;/span&gt; &lt;/li&gt; &lt;/script&gt; </code></pre> <p>Knockout </p> <pre><code>var Person = function(name) { this.name = ko.observable(name); }; var PeopleModel = function() { var self = this; self.drag_start_index = ko.observable(); self.drag_target_index = ko.observable(); self.dragging = ko.computed(function() { return self.drag_start_index() &gt;= 0; }); self.people = ko.observableArray([ new Person("Oleh"), new Person("Nick C."), new Person("Don"), new Person("Ted"), new Person("Ben"), new Person("Joe"), new Person("Ali"), new Person("Ken"), new Person("Doug"), new Person("Ann"), new Person("Eve"), new Person("Hal")]); self.trash = function(index) { self.people.splice(index, 1) } self.swap = function(from, to) { if (to &gt; self.people().length - 1 || to &lt; 0) return; var fromObj = self.people()[from]; var toObj = self.people()[to]; self.people()[to] = fromObj; self.people()[from] = toObj; self.people.valueHasMutated() } }; ko.applyBindings(new PeopleModel());​ </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload