在这里看很多帖子,但没有找到我想要的。
Jstree版本是3.3.3。
我想在发送ajax请求的create_node事件之后选择一个节点。
然后jstree射击rename_node事件。在此事件中,我提出了另一个AJAX请求,以重命名类别或数据库中的文章。
在这里我需要刷新树,以便为了新节点获得正确的ID等...
这是一个Ajax调用,用服务器端JSON重建节点,JavaScript继续执行代码...(
因此,我发现选择新节点的唯一解决方案是制作一个settimeout,以确保重建树,然后我解析我的URL以选择这样的节点:
// Select Article or Category newly created
if ( window.location.pathname.split("/")[3] == "edit" ) {
id = window.location.pathname.split("/")[2]
controller = window.location.pathname.split("/")[1] == "articles" ? "article_" : "category_"
setTimeout(function(){
$('#tree').jstree("deselect_all")
$('#tree').jstree("select_node", controller+id)
},1500);
}
我不喜欢这样,如果Ajax请求重建节点失败或太长,这将导致问题。
我没有在刷新事件上找到回调。
以一种完全不同的方式进行操作,在创建中选择节点,然后在文章/:id/edit或category/catpory/:id/edit 上重定向
// Create category && articles
.on('create_node.jstree', function (e, data) {
data_JSON = {}
if ( data.node.type === "category" ) {
controller = "categories"
data_JSON = { parent_id : data.parent.match(/d+/)[0] } // DRY
} else {
controller = "articles"
data_JSON = { category_id : data.parent.match(/d+/)[0] } // DRY
}
$.ajax({
url : "/" + controller + "/new",
method : "GET",
dataType : "json",
data : data_JSON
})
.done(function (d) {
data.instance.deselect_all()
data.node.id_number = d[data.node.type + "_id"]
data.instance.set_id(data.node.id, data.node.type+"_"+data.node.id_number)
data.instance.select_node(data.node.id)
data.node.userCreatedNode = true
});
})
// Rename category && articles
.on('rename_node.jstree', function (e, data) {
controller = data.node.type === "category" ? "categories" : "articles"
data_JSON = {}
data_JSON[data.node.type] = { id : data.node.id, title : data.text }
data.node.id_number===undefined && ( data.node.id_number = data.node.id.match(/d+/) )
$.ajax({
url : "/" + controller + "/" + data.node.id_number,
method : "PATCH",
dataType : "json",
data : data_JSON
})
.done( function (d) {
if ( data.node.userCreatedNode == true ) {
edit_path = window.location.origin+"/"+controller+"/"+data.node.id_number+"/edit"
window.location.href = edit_path
}
});
})