【发布时间】:2011-09-07 16:56:06
【问题描述】:
我们创建了一个代表文件系统的 jqGrid TreeGrid,其中分支是文件夹,叶子是文件。我们已经在 TreeGrid 中实现了使用 addChildNode 创建新“文件”的功能,这已经足够好了。但是,我们还想添加创建新文件夹的功能。我们的脚本可以创建新文件夹,但它们不会立即显示在 TreeGrid 上,除非它或页面重新加载。但是,重新加载 TreeGrid 会折叠所有文件夹,这特别烦人。
有没有办法选择性地刷新 TreeGrid 的节点,或者添加一个新的分支?我在addJSONData 上看到了一些部分文档,但使用此函数会完全清除 TreeGrid,直到刷新。我还尝试使用addChildNode 并更改某些属性,并且尝试使用DOM 操作手动添加行;但是,这两种方法都会破坏插入的节点。
编辑:
var grid = $("#grid");
grid.jqGrid({
treeGrid: true,
treeGridModel: "adjacency",
ExpandColumn: 'name',
ExpandColClick: true,
url:"",
datatype:"json",
colNames:['id','Name','Authorization','Views','Uri'],
colModel:[ {name:'id', index:'id', hidden:true, key:true},
{name:'name', index:'name', sorttype:"text", width:3, sortable:false},
{name:'auth',index:'auth', sorttype:"text", sortable:false, hidden:true},
{name:'views',index:'views', sorttype:"integer", width:1, sortable:false, align:"center"},
{name:'uri',index:'uri',sorttype:'text',sortable:false,hidden:true}],
jsonReader:{ root:"rows"
,page:"page"
,total:"total"
,records:"records"
,repeatitems:false
,cell:""
,id:"0"
,userdata:""
},
multiselect:false,
autowidth:true,
height:"auto",
sortable:false,
toppager:true,
hidegrid: false,
loadui: 'block',
pager:"#grid_pager",
caption: "Files",
});
对新文件夹返回的 JSON 请求如下所示:
ret = {"error":"","total":1,"page":1,"records":1,"rows":[{"id":"1113","name":"test","uri":"accounting\/test\/","parent":1,"isLeaf":false,"expanded":true,"loaded":true}]}
我尝试使用以下内容添加:
grid[0].addJSONData(ret);
加载的初始数据以 JSON 格式发送:
{"rows":[
{"id":"1","uri":"afolder\/","parent_id":"0","name":"afolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"4","uri":"bfolder\/","parent_id":"0","name":"bfolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"7","uri":"cfolder\/","parent_id":"0","name":"cfolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"20","uri":"dfolder\/","parent_id":"0","name":"dfolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"48","uri":"efolder\/","parent_id":"0","name":"efolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"179","uri":"ffolder\/","parent_id":"0","name":"ffolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"182","uri":"gfolder\/","parent_id":"0","name":"gfolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"186","uri":"hfolder\/","parent_id":"0","name":"hfolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"201","uri":"ifolder\/","parent_id":"0","name":"ifolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"239","uri":"jfolder\/","parent_id":"0","name":"jfolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"253","uri":"kfolder\/","parent_id":"0","name":"kfolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"262","uri":"lfolder\/","parent_id":"0","name":"lfolder","level":0,"parent":"0","isLeaf":"false"},
{"id":"274","uri":"mfolder\/","parent_id":"0","name":"mfolder","level":0,"parent":"0","isLeaf":"false"}
]}
【问题讨论】:
-
添加代码总是很有帮助的,因为它可以获得许多额外的重要信息。您能否描述更多有关您使用的 TreeGrid 的信息。您是使用本地数据还是从服务器加载数据。您是一次加载整个网格还是在扩展其父节点时加载子节点?您拥有哪种网格模型:嵌套集模型或邻接模型。您如何获得有关应添加到树形网格中的新文件夹的信息?会从某些页面输入控件中填充信息还是从服务器加载?
-
我们使用邻接模型,并随着节点的扩展从 MySQL 数据库中以 JSON 请求的形式获取数据。通过 AJAX 请求在数据库中创建新文件夹记录,以 JSON 请求返回有关新文件夹的信息。添加代码。
-
对不起,我还是不明白情况。首先,使用来自服务器的数据填充树网格。如果用户单击树节点,则将从服务器加载该节点的子节点。为什么需要再添加一个节点(文件夹)?为什么新文件夹的数据包含父级 (
"parent":1)?可能了解您如何填充网格与您的主要问题有关。您写了关于“获取数据”的文章,但来自数据库。我无法想象这样的情况。如果您从数据库中进行 SELECT,您可以将所有结果发送到网格。是这样吗? -
我们无法一次获取所有数据,但可能只是没有正确实现。创建新节点的原因是因为每个节点代表一个文件夹,用户可以创建新的文件夹。如果我们创建一个新文件夹,它会在数据库中创建条目,但不会更新网格,因此我们创建一个新节点以显示该文件夹是实际创建的。另一个可接受的解决方案是刷新新创建的文件夹的父节点。
-
是的,我们最初将网格显示为仅根节点。在扩展节点时,该节点的子节点被检索并发送到网格。我们无法实现一次获取所有数据的网格。
标签: javascript jquery jqgrid treegrid