У меня есть древовидный список, который можно сворачивать и разворачивать пользователемОбновить существующий список, чтобы соответствовать новому списку
<ul>
<li class="exp">
...
</li>
<li>
...
</li>
</ul>
Содержания, если этот список ленивый загружен, поскольку он может быть большим, но и потому, что он может измениться в зависимости от того, что еще делает пользователь на странице.
Ленивая загрузка работает нормально, но обновление после удаления/добавления элементов в список является проблемой
То, как я делаю это сейчас, как это:
var old_i = 0,
new_v = [];
new_li.each(function(i, li){
new_v.push(node.dataset.value);
// new li at the end
if(!old_li.get(old_i)){
old_ul.append(li);
return;
}
// existing li
if(li.dataset.value == old_li.get(old_i).dataset.value){
old_i++;
return;
}
// new li before the end
$(li).insertBefore(old_li.get(old_i));
});
// remove non-existing
old_i.each(function(idx, li){
if(new_v.indexOf(li.dataset.value) < 0)
$(li).remove();
});
Но когда Я удаляю li, который предшествует последнему, последний дублируется. Я думаю, что проблема близка к insertBefore, но я не знаю, что вызывает ее.
Еще одна вещь, которую я не знаю, как это сделать, - это пересортировать старый список, чтобы он соответствовал заказу нового списка.
Я знаю, что я могу просто заменить список, чтобы упростить задачу, но тогда я потеряю состояние расширения пользователя. И не только классы состояний, но и контент, потому что ответ ajax возвращает только то, что нужно обновить, то есть содержание активных li (прямых детей). Но пользователь может расширить ребенок или внук его, и содержание тех, будет потерян на с заменить