jQuery проблема допуска с сортировкой и отбрасыванием

У нас есть вложенное меню на нашей странице, где перетаскивание позволяет изменять порядок и вкладывать элементы меню.

Кажется, есть проблема (мы используем jQuery 1.7.2 и UI 1.8.22), когда у вас есть как сортируемый, так и удаляемый, допуск для сортировки не соответствует и вызывает проблему.

Пример объяснит это лучше, чем я могу...

http://jsfiddle.net/8fUxV/5/

Я только что создал минимум, необходимый для демонстрации проблемы, а не вложенные меню, а просто механизм, который мы используем, чтобы заставить его работать.

Поднимите «Предмет 4» и очень медленно перетащите его вверх. 3 станет выделенным, что означает, что это цель для сброса. Хорошо, но продолжайте двигаться вверх, пока он не окажется в промежутке между 2 и 3. Я хочу бросить его здесь и вызвать сортировку. Но если я это сделаю, поскольку 3 все еще выделено, вместо этого он «отпадет» (и в нашем реальном коде создаст вложенное меню).

На самом деле есть несколько пикселей непосредственно перед пунктом 2, где вы можете получить желаемый эффект. Однако, если вы переместитесь слишком далеко, он снова упадет вместо сортировки.

По сути, проблема в том, что я бы подумал, что если бы элемент был в промежутке, он должен сортироваться и отбрасываться только тогда, когда я нахожусь над другим выделенным элементом.

У меня есть часть обходного пути, который заставляет пользовательский интерфейс пересчитывать позиции - раскомментируйте код в функции «out».

Теперь, хотя у вас все еще возникает та же проблема, если вы перетащите 4 вверх, если вы коснетесь 2 и вернетесь вниз в зазор, ничего не будет выделено, поэтому оно будет правильно отсортировано.

Но проблема остается в том, что первое перетаскивание вверх не работает так, как можно было бы ожидать при первой перестановке.

(Я попытался добавить обходной путь в _mousedrag ui.sortable в коде jquery.ui, и это действительно решает проблему.... но я понятия не имею, что я там делаю :)

Так что я не уверен, что я делаю что-то не так или это ошибка?

Кто-нибудь сталкивался с чем-то подобным, прежде чем я зарегистрирую отчет об ошибке?


person cdm9002    schedule 08.08.2012    source источник


Ответы (1)


Покопавшись в источнике, я нашел вариант, который устраняет проблему.

Проблема в том, что позиция вычисляется неправильно, когда элемент перемещается, а фиктивный заполнитель вставляется в список.

Вам нужно добавить это в свой сортируемый,

refreshPositions: true

e.g.

$("ul").sortable({
    helper: "original",
    refreshPositions: true,
    update: function(event, ui) {
       :
    }
});

Это заставляет его пересчитывать позицию при каждом движении мыши. Крайне неэффективно, но иначе просто не получится.

person cdm9002    schedule 08.08.2012