最近在做的项目中有关ztree的开发,遇到了一个问题,当弹出ztree树的时候,是这样的:这个时候点击新增按钮,会弹出一个隐藏的框框,添加完信息后,把新添加的节点添加到ztree树中。
可是在调用addNodes方法的时候会出现节点添加两次的现象,大家在网上可能会找到很多有关ztree添加节点重复的问题,这个我就不提了。
现在给出不一样的解决方案,我们首先知道,为什么会出现重复添加的问题。
原因在于:我们异步加载了一次,然后再addNodes 这样就添加了两个节点。(这里如果我们调用展开节点方法,expendNode 这个方法貌似是不好使的,我也没搞清楚这是为什么,当我们调用reAsyncChildNodes方法的时候会自动展开树)
所以本人就不去调用addNodes方法了,这样就不会出现重复添加的问题了,但是怎么才能把添加的节点自动勾选上呢?
这个真是个问题,所以采用后台添加的方式:
async:{
autoParam:["id"],
enable:true,
url : getUrl
}
在ztree的属性中添加这个,其中的getUrl为自己定义的一步方法的url。
这里先提供自身在弹出页面填写后ajax返回的操作方法:
if($("#customerForm").valid()){
$('#customerForm').ajaxSubmit({
type:"post",
dataType: "json",
async : false,
url: '${ctx}/system/cusCustomerInfo/saveAndReturnJSON.action',
success: function(data){
var oldNode = zTreeObj.getNodeByParam("id",$("#customerId").val());
if(oldNode){
oldNode.checked = false;
zTreeObj.updateNode(oldNode);
}
$("#customerId").val(data.id);
var node = zTreeObj.getNodeByParam("id",data.companyProfession);
node.isParent = true;
zTreeObj.reAsyncChildNodes(node, "refresh");
closeAddDiv();
}
});
}else{
$.watermark.showAll();
}
这里会看见, $("#customerId").val(data.id); 这个赋值就个为了下方 zTreeObj.reAsyncChildNodes(node, "refresh");刷新的时候调用一步方法的url的参数。
function getUrl(treeId,treeNode){
var idsStr = pId == '1' ? $("#customerId").val() : $("#partcId").val();
return "${ctx}/system/cusContactInfo/toSetCustomerToContact.action?idsStr="+idsStr;
红色字体就是自动选中的隐藏域id。
这时在后台遍历添加上checked=true就ok了。}