我使用Sortable
来组织父分组中的列表,这些列表本身也是可排序的,类似于demo page上的 multi 示例,但是文本。这很好用,并使用以下代码:
var globObj = {};
function prepSortCats() {
globObj.subCatsGroup = [];
// Changing parent group order
globObj.sortyMainCats = Sortable.create(catscontainer, {
// options here omitted from example
onUpdate: function( /**Event*/ evt) {
// Send order to database. Works fine.
}
});
// Changing sub list order
globObj.subCatsGroup.forEach.call(document.getElementById('catscontainer').getElementsByClassName('subcatlist'), function(el) {
var sortySubCats = Sortable.create(el, {
// options here from example
onUpdate: function( /**Event*/ evt) {
// Send order to database. Works fine.
}
});
});
}
使用以下命令加载页面时调用:
$(document).ready(function () {
// Sortable
prepSortCats();
});
到目前为止一切顺利。但是,用户可以将新元素引入任何列表(子列表或父列表)。简而言之,首先将用户添加的任何新元素添加到数据库中,然后使用ajax
刷新页面的相关部分以从数据库中提取更新的内容并显示该内容。用户将其新添加的项目添加到其中一个现有列表中。 Ajax
电话如下:
function refreshCategories() {
var loadUrl = "page that pulls lists from database and formats it";
$("#catscontainer")
.html(ajax_load)
.load(loadUrl);
return false;
};
这也很好用。除此之外,Sortable
不再有效。我无法拖动任何列表。我的第一个想法是销毁现有的Sortable
实例并重新初始化它们。在我致电refreshCategories()
之后,我打电话给以下人员:
if(globObj.sortyMainCats.length !== 0) {
globObj.sortyMainCats.destroy();
}
if(globObj.subCatsGroup.length !== 0) {
var i;
for (i = globObj.subCatsGroup.length - 1; i >= 0; i -= 1) {
globObj.subCatsGroup[i].destroy();
globObj.subCatsGroup.splice(i, 1);
}
}
prepSortCats();
但Sortable
仍无效。我介绍了全局对象(尽管存在争议),以便我可以将Sortable
个实例定位在其范围之外,但我似乎忽略了一些东西。有任何想法吗?抱歉没有提供工作实例。当我对服务器进行各种ajax
调用时,我不认为这是可行的。
我明显误解了一些正在发生的行动。好吧,我应该通过说我错过了我可以在用aja
x和refreshCategories()
重新加载页面的一部分后仍然可以组织组/父列表。这是能够对子列表进行排序的次要操作,这是我注意到的已经破坏并且仍然如此。
但它确实指出,尽管$("#catscontainer")
的整体被替换为清单的更新版本(并且包含所有内容,列出元素),Sortable
仍然有在它上面运行的某种实例。我的理解是,它与被删除的元素有某种联系。现在,我对如何将Sortable变为以下任何一种方式更加迷失:(a)只是从头开始,执行prepSortCats()
,好像这是一个新的页面加载并删除任何以前的{{1}实例,或者(b)在Sortable
调用之后获取剩余的Sortable
实例以识别添加的元素。
取得一些进展。
通过反复试验,我发现在调用ajax
之后,调用refreshCategories()
即使是在订购组列表时也是如此。然后,如果我在此之后拨打globObj.sortyMainCats.destroy()
,我可以再次移动它们。但不是子列表。
这不是决定性的,但看起来我已成功销毁并重新初始化prepSortCats()
,这是我的目标,但有关Sortable
已加载元素的内容并非如此使用ajax
。
答案 0 :(得分:0)
我在错误的地方寻找答案,确定这是ajax
加载内容的问题,并且dom与Sortable
期望的内容存在一些不一致。
原来这是一个异步问题。或者,更简单一点,当ajax
被要求重新注册时,由Sortable
加载的页面部分还没有准备就绪。
对于遇到同样问题的人,我改变了:
$("#catscontainer")
.html(ajax_load)
.load(loadUrl);
到
$("#catscontainer")
.html(ajax_load)
.load(loadUrl, function() {
reinitSortable();
});
其中reinitSortable()
只是一个触发destroy
和prepSortCats()
功能的功能,类似于上面显示的功能。