Scriptaculous Сортируемый по обновлению не стреляет
У меня проблемы с использованием Sortable
класс из scriptaculous lib: кажется, что onUpdate
обратный вызов никогда не вызывается, если я использую only
приписывать. Вот рабочий пример, который не использует атрибут "only":
<ul id="test">
<li id="item_1" class="level0">
item 1
<ul>
<li id="item_2" class="level1">item 1.1</li>
<li id="item_3" class="level1">item 1.2</li>
</ul>
</li>
<li id="item_4" class="level0">
item 2
<ul>
<li id="item_5" class="level1">item 2.1</li>
<li id="item_6" class="level1">item 2.2</li>
</ul>
</li>
</ul>
<script type="text/javascript">
Sortable.create("test", {
tree: true,
onUpdate: function(item) { alert(item.readAttribute("id")) },
});
</script>
Этот код работает хорошо: onUpdate
называется правильно, но теперь, если я изменю Sortable.create()
добавить only
атрибут, как и следующий, onUpdate
больше не вызывается:
Sortable.create("test", {
tree: true,
only: 'level1',
onUpdate: function(item) { alert(item.readAttribute("id")) },
});
Кто-нибудь уже исправил это? Спасибо
1 ответ
После некоторой отладки в dragdrop.js
Исходный код, я, наконец, обнаружил, что метод сериализации, который используется для обнаружения изменений в дереве, был ограничен корневым элементом (но я не исследовал, почему это было нормально без only
атрибуты).
Основываясь на версии ScriptAll 1.9.0, я мог бы исправить это путем исправления dragdrop.js
, Я нашел несколько способов исправления кода:
Изменяя
serialize
Метод: этот метод создаетoptions
объект, но не использует его, за исключением тестированияoptions.tree
, Опции переданыSortable.tree
являютсяarguments[1]
что я думаю, это ошибка. Первый метод исправления состоит в заменеarguments[1]
отoptions
(строки 936 и 940):929 serialize: function(element) { 930 element = $(element); 931 var options = Object.extend(Sortable.options(element), arguments[1] || { }); 932 var name = encodeURIComponent( 933 (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); 934 935 if (options.tree) { 936 return Sortable.tree(element, options).children.map( function (item) { 937 return [name + Sortable._constructIndex(item) + "[id]=" + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); 938 }).flatten().join('&'); 939 } else { 940 return Sortable.sequence(element, options).map( function(item) { 941 return name + "[]=" + encodeURIComponent(item); 942 }).join('&'); 943 } 944 }
Второй метод заключается в добавлении вручную
options.tree
значение. Это можно сделать вtree
такой метод (строки 877 и 'NEW'):872 var options = Object.extend({ 873 tag: sortableOptions.tag, 874 treeTag: sortableOptions.treeTag, 875 only: sortableOptions.only, 876 name: element.id, 877 format: sortableOptions.format, NEW tree: sortableOptions.tree 878 }, arguments[1] || { });
Также было бы возможно исправить findElements
метод для того, чтобы изменить options.tree ? true : false
в options.treeTag ? true : false
поскольку options.tree
никогда не устанавливается, поэтому исходный тест всегда будет возвращаться false
, но я не уверен в побочных эффектах.