Json 从KendoUI TreeView获取当前数据
我正在使用一个剑道UI树,其中包含来自JSON文件的远程数据源。 我在树页面上有一个按钮,它获取树的当前数据,通过POST发送到服务器,服务器将当前数据保存到JSON文件中,以便下次我重新加载页面时,保留我所做的更改。这就是我希望发生的事 所以我知道树的当前数据在:Json 从KendoUI TreeView获取当前数据,json,treeview,datasource,kendo-ui,Json,Treeview,Datasource,Kendo Ui,我正在使用一个剑道UI树,其中包含来自JSON文件的远程数据源。 我在树页面上有一个按钮,它获取树的当前数据,通过POST发送到服务器,服务器将当前数据保存到JSON文件中,以便下次我重新加载页面时,保留我所做的更改。这就是我希望发生的事 所以我知道树的当前数据在: $("#treeview").data("kendoTreeView").dataSource.data() 这意味着数据会实时变化,例如当有人拖放树的节点时 当我在树中拖放节点时,这些数据似乎没有改变,只有当我在树的根级别上拖放
$("#treeview").data("kendoTreeView").dataSource.data()
这意味着数据会实时变化,例如当有人拖放树的节点时
当我在树中拖放节点时,这些数据似乎没有改变,只有当我在树的根级别上拖放节点时,数据才会改变,即使这样,它也不会正确地执行操作,因为节点也应该移动到树中,但节点会被复制,并将过去的节点留在树中
例如,我有一棵树:
如果我进行如下拖放更改:
我发送数据,保存数据,然后重新加载,根本没有做任何更改
PS:即使我在发送更改后查看当前数据,我发现数据根本没有任何更改,即使我通过拖放可视化地进行了更改。因此,这与发送、保存和服务器无关
另一方面,如果我做出这样的改变:
我可以在当前数据中看到,移动的节点确实添加到了数据的末尾,但它没有从数据中的初始位置删除!因此,如果我将当前数据发送到服务器,保存它,然后刷新,我会得到结果:
查看和发送数据的代码为:
function sendData() {
var req = createRequest();
var putUrl = "rest/hello/treeData";
req.open("post", putUrl, true);
req.setRequestHeader("Content-type","application/json");
var dsdata = $("#treeview").data("kendoTreeView").dataSource.data();
alert(JSON.stringify(dsdata));
req.send(JSON.stringify(dsdata));
req.onreadystatechange = function() {
if (req.readyState != 4) {
return;
}
if (req.status != 200) {
alert("Error: " + req.status);
return;
}
alert("Sent Data Status: " + req.responseText);
}
}
这是一个Bug还是我做错了什么?是否有人能够在每次拖放时看到当前数据的正确变化?首先也是最重要的一点,您必须使用最新版本的KendoUI(Kendo UI Beta v2012.3.1024)仍处于测试阶段,但这正是他们解决了许多问题的地方 然后,当您创建kendoTreeView时,您必须说:
tree = $("#treeview").kendoTreeView({
dataSource :kendo.observableHierarchy(data),
dragAndDrop:true
}).data("kendoTreeView");
这里重要的是不是直接使用数据数组,而是用kendo.observehierarchy
包装它
然后,您将使用拖放结果更新数据。对于我来说,除了OnaBai answer,我还必须使用保存方法上的同步功能。我正在使用类型脚本
this.treeData = new kendo.data.HierarchicalDataSource({
data: kendo.observableHierarchy([]),//Thanks OnaBai
schema: {
model: {
id: "MenuItemId",
children: "MenuItemChildren",
hasChildren: (e) => {
//this removes arrow next to items that do not have children.
return e.MenuItemChildren && e.MenuItemChildren.length > 0;
}
}
}
});
public save() {
this.treeData.sync().done(() => {
console.log("sync data");
var myType = this.treeData.view();
this.$http.post("/api/TreeViewPicker", myType)
.then((response) => {
});
});
}
的确,它工作得很好!非常感谢你!!顺便说一句,你知道处理文件夹旁边的展开箭头的方法吗?因为我猜beta版中有一些错误,展开箭头也会显示在没有子节点的节点上。(另外,在初始化时箭头似乎不会展开到展开的文件夹,但我想beta版中应该存在小故障)如果要删除那些没有子节点的节点上的额外箭头,只不过没有在其上定义
项。如果有项
,即使它是空的,也会得到箭头。理论上不确定这是一个特性还是一个缺陷,扩展所有节点应该是tree.expand(“.k-item”)代码>但由于某种原因(bug?)它(总是)不起作用。我找到了两个解决办法:1。在json中定义一个“扩展”字段,并将其设置为“true”。2.执行tree.expand('.k-item')
两次!!。又来了!关于未展开的箭头,数据数组似乎也保存了展开的状态,因此没有问题,非常棒!关于额外的箭头,如果不存在items
字段,则数据数组会自动添加空的items
字段,因此我似乎无法在那里执行任何操作..除了搜索json文件和删除项目之外,还有其他解决方法吗:[]
fields everytime??任何其他已知的控制箭头的方法?对我来说也是如此,如果JSON没有项
字段,那么我也得不到箭头!问题是,当我拖放一个节点时,如果该节点根本没有项
字段,那么当剑道将节点写入新位置时,会自动在节点上添加“项”:[]
!