#ajax #jquery-ui #jquery-ui-sortable
#ajax #jquery-пользовательский интерфейс #jquery-ui-sortable
Вопрос:
У меня есть сортировка jquery с обратным вызовом ajax, привязанным к событию обновления. Обратный вызов ajax отправляет обновленный порядок сортировки обратно на сервер, а затем выполняет обновление сортировки, чтобы гарантировать, что клиент и сервер синхронизированы.
Проблема, с которой я сталкиваюсь, заключается в том, что пользователь может запустить новое событие сортировки до завершения вызова ajax — я бы хотел предотвратить это.
Что я пытался сделать, так это отключить сортировку при событии обновления, а затем снова включить ее, когда вызов ajax вернулся. Однако, если я не перепутал последовательность, это, похоже, не сработало — я все еще могу запустить новое сортируемое перетаскивание, пока вызов ajax все еще активен.
Есть ли какой-либо другой способ предотвратить это? Я, конечно, могу установить глобальную переменную javascript, которая говорит: «Эй, не сейчас, я подключаю ajax …» и ссылаться на нее, но я не уверен, какое событие сортировки будет проверять это или как оно уничтожит запрос на сортировку.
Мысли?
Комментарии:
1. Одна вещь, которую я подозреваю, заключается в том, можете ли вы отключить сортировку, которая в данный момент активна. Другими словами, могу ли я отключить сортировку внутри собственного метода обновления?
2. теперь это очень старый вопрос, но помните ли вы, пробовали
element.sortable('option', 'disabled', 'true')
ли вы вместоelement.sortable('disable')
? если да, то оказало ли это большее влияние, чем другое?
Ответ №1:
Для лучшего взаимодействия с пользователем…
Вместо отключения интерфейса вы должны отменить предыдущий запрос ajax, чтобы он не перезаписывал новые запросы.
Это позволяет адаптивному, гибкому и гибкому интерфейсу. Это позволяет пользователю «передумать» и изменить порядок списка в ожидании его сохранения. Все старые запросы отменяются и, следовательно, не перезаписывают новые запросы…
//keep track of ajax request to allow cancellation of requests:
var ajaxRequest = null;
$('ul.sortable').sortable({
containment: 'parent',
update: function (event, ui) {
//display your loading anim gif
//get list of ids in correct order:
var ids = $(this).sortable('toArray').toString();
//cancel any previous ajax requests:
if (ajaxRequest) {
ajaxRequest.abort();
}
//post order to web service:
ajaxRequest = $.ajax({
type: 'POST',
url: 'somewebservice.blah',
data: ids,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (response) {
//saved ok:
ajaxRequest = null;
//hide your loading anim gif
}
});
}
});
Ответ №2:
Вы можете просто наложить прозрачный абсолютно позиционированный div на весь список, что предотвратит любые щелчки / перетаскивания по списку.
Установите для него в вашем CSS значение display: none
. Затем, когда вы инициируете вызов AJAX, установите для него значение display: block
, а когда ваш вызов AJAX завершится, переключите его обратно на display: none
.
Комментарии:
1. Ах, я должен был упомянуть, что у меня уже есть небольшой дисплей «Пожалуйста, подождите …», который отображается на лекарственном препарате. То, что вы предлагаете, сработало бы, хотя в том смысле, что это, по сути, защитило бы весь список.
2. В итоге я использовал этот метод, хотя и считаю его чем-то вроде клуджа. Мне кажется, что нужно иметь возможность эффективно отключать и включать сортировку для такого случая, но прямые вызовы для отключения сортировки (через jqueryui.com/demos/sortable/#method-disable ), казалось, не имело никакого эффекта вообще.
Ответ №3:
Вы пытались установить свойство disabled?
$('#sortable').sortable('option', 'disabled', true )
А затем после запроса ajax
$('#sortable').sortable('option', 'disabled', false )
Комментарии:
1. Я явно не отключал / включал этот вызов, а скорее с помощью $(‘.my-list’).sortable(‘enable’); и $(‘.my-list’).sortable(‘disable’);
2. О, глядя на API, я не думаю, что то, что вы используете, является правильным использованием. jqueryui.com/demos/sortable/#option-disabled . То, что вы, похоже, делаете, это повторная инициализация, также аргументы должны быть объектом, а не строкой.
3. См . jqueryui.com/demos/sortable/#method-disable хотя для отключения / включения с помощью метода. Я только что добавил комментарий выше, но может ли сортируемый отключить себя внутри собственного обработчика событий обновления?