jsTree tuyệt vời nhưng tài liệu của nó khá dày đặc. Tôi cuối cùng đã tìm ra nó vì vậy đây là giải pháp cho bất cứ ai chạy vào chủ đề này.
Thứ nhất, bạn cần ràng buộc sự kiện open_node với cây đang được đề cập đến. Nội dung nào đó dọc theo dòng
$("tree").jstree({"themes":objTheme,"plugins":arrPlugins,"core":objCore}).
bind("open_node.jstree",function(event,data){closeOld(data)});
tức là bạn định cấu hình cá thể xem ảnh và sau đó ràng buộc sự kiện open_node. Ở đây tôi gọi hàm closeOld để thực hiện công việc mà tôi yêu cầu - đóng bất kỳ nút nào khác có thể đang mở. Hàm này giống như vậy
function closeOld(data)
{
var nn = data.rslt.obj;
var thisLvl = nn;
var levels = new Array();
var iex = 0;
while (-1 != thisLvl)
{
levels.push(thisLvl);
thisLvl = data.inst._get_parent(thisLvl);
iex++;
}
if (0 < ignoreExp)
{
ignoreExp--;
return;
}
$("#divElements").jstree("close_all");
ignoreExp = iex;
var len = levels.length - 1;
for (var i=len;i >=0;i--) $('#divElements').jstree('open_node',levels[i]);
}
Thao tác này sẽ xử lý chính xác gấp tất cả các nút khác bất kể mức lồng của nút vừa được mở rộng.
Một lời giải thích ngắn gọn về các bước liên quan
- Đầu tiên chúng ta bước sao lưu treeview cho đến khi chúng ta đạt đến một nút cấp cao nhất (-1 trong jstree nói) và đảm bảo rằng chúng tôi ghi lại mọi nút tổ tiên gặp phải trong quá trình trong mảng mức
- Tiếp theo chúng ta sụp đổ tất cả các nút trong treeview
- Bây giờ chúng ta lại mở rộng tất cả các nodees trong mức mảng. Trong khi làm như vậy, chúng tôi không muốn mã này thực hiện lại. Để ngăn chặn điều đó xảy ra, chúng tôi thiết lập toàn cầu ignoreEx biến với số lượng các nút trong mức
- Cuối cùng, chúng tôi bước qua các nút trong mức và mở rộng mỗi một trong số họ