Используя отсортированный список jQueryUI с формами
Я использую jQueryUI для создания сортируемого списка, а часть пользовательского интерфейса отлично работает, поскольку я могу сортировать элементы по желанию на веб-странице. Однако я не могу понять, как порядок отсортированного списка включен в POST. Я полный noob с javascript, поэтому, пожалуйста, простите меня, если это действительно просто.
Вот соответствующие части моего html:
<script type="text/javascript">
google.load("jquery", "1");
google.load("jqueryui", "1");
function OnLoad(){
$( "#sortable" ).sortable({ axis: "y", containment: "#ballot", scroll: false });
$( "#sortable" ).disableSelection();
}
google.setOnLoadCallback(OnLoad);
</script>
[...]
<form method="POST" action="/vote">
<input type="hidden" name="key" value="{{ election.key }}">
<input type="hidden" name="uuid" value="{{ uuid }}">
<div id="ballot" class="center">
<ol id="sortable" class="rankings">
<li class="ranking">Jamie</li>
<li class="ranking">Joanie</li>
<li class="ranking">Morley</li>
<li class="ranking">Frank</li>
<li class="ranking">Larry</li>
</ol>
</div>
</form>
Как может порядок Jamie, Joanie, Morley, Frank и Larry быть закодирован в POST?
Ответы
Ответ 1
Вы можете использовать метод .serialize
для вашего сортируемого объекта: http://docs.jquery.com/UI/Sortable#method-serialize
$( "#sortable" ).sortable('serialize')
предоставит вам массив элементов, подлежащий аяксу. Просто назначьте его в поле ввода, если вы не используете ajax. Или просто передайте его в свой массив данных, если используете ajax
ИЗМЕНИТЬ
Пример здесь: http://jsfiddle.net/jomanlk/KeAer/2/
Как отмечают jquery docs, для этого для работы ваши элементы должны иметь идентификаторы в форме set_number
(например, rank_1, rank_2). Поэтому я изменил ваш HTML
Просто удалите return false
в форме, и сериализованное значение будет установлено в поле ввода при отправке формы
Ответ 2
Другой вариант состоит в том, чтобы просто иметь поле скрытой формы ввода с идентификационным значением для элемента в качестве значения и того же имени. Затем отправьте форму после сортировки. Все значения будут доступны в опубликованных данных в том порядке, в котором они были после сортировки.
Я делаю что-то вроде этого:
$(".sortable").each(function () {
$(this).sortable({
update: function (event, ui) {
$(this).closest("form").trigger("onsubmit");
}
});
});
И форма выглядит так:
<form ...>
<ul class="sortable">
<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Some info here<input id="id_name" name="id_name" type="hidden" value="1" /></li>
<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Some more info<input id="id_name" name="id_name" type="hidden" value="2" /></li>
</ul>
</form>