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, Я нашел несколько способов исправления кода:

  1. Изменяя 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  }
    
  2. Второй метод заключается в добавлении вручную 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, но я не уверен в побочных эффектах.

Другие вопросы по тегам