Json 从KendoUI TreeView获取当前数据

Json 从KendoUI TreeView获取当前数据,json,treeview,datasource,kendo-ui,Json,Treeview,Datasource,Kendo Ui,我正在使用一个剑道UI树,其中包含来自JSON文件的远程数据源。 我在树页面上有一个按钮,它获取树的当前数据,通过POST发送到服务器,服务器将当前数据保存到JSON文件中,以便下次我重新加载页面时,保留我所做的更改。这就是我希望发生的事 所以我知道树的当前数据在: $("#treeview").data("kendoTreeView").dataSource.data() 这意味着数据会实时变化,例如当有人拖放树的节点时 当我在树中拖放节点时,这些数据似乎没有改变,只有当我在树的根级别上拖放

我正在使用一个剑道UI树,其中包含来自JSON文件的远程数据源。 我在树页面上有一个按钮,它获取树的当前数据,通过POST发送到服务器,服务器将当前数据保存到JSON文件中,以便下次我重新加载页面时,保留我所做的更改。这就是我希望发生的事

所以我知道树的当前数据在:

$("#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没有
字段,那么我也得不到箭头!问题是,当我拖放一个节点时,如果该节点根本没有
字段,那么当剑道将节点写入新位置时,会自动在节点上添加
“项”:[]