2013-07-23 6 views
0

У меня возникли проблемы с использованием класса Sortable из scriptaculous lib: кажется, что обратный вызов onUpdate никогда не вызывается, если я использую атрибут only. Вот рабочий пример, который не использует «только» атрибут:Scriptaculous Sortable onUpdate not firing

<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 атрибута).

Основанный на версии scriptaculous 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, но я не уверен в побочных эффектах.

 Смежные вопросы

  • Нет связанных вопросов^_^