访问选定 Kendo TreeView 节点的 Child 节点

Accessing the Child Nodes of a Selected Kendo TreeView Node

我有一个 Ajax 填充的树视图....

@(Html.Kendo().TreeView()
    .Name("fao")
    .HtmlAttributes(new {@class="fixed-height" })
    .DataTextField("Text")
    .TemplateId("treeview-item-template")
    .DataSource(ds => ds
        .Read(r => r
            .Action("_ModuleData", "Home")
        )
        .Model(m => m
            .Children("Items")
            .HasChildren("HasChildren")
        )
    )
)

我需要更新一些隐藏在每个 child 项目中的数据 - 在模板中 - 当一个动作(在控制之外触发)发生时。

为了完整起见,模板看起来像这样......

<script id="treeview-item-template" type="text/kendo-ui-template">
    #= item.Text #<input type='hidden' class='hidden-data' data-fal='#= item.Fal#' data-uid='#=item.uid#'/>
</script>

现在,我有了触发器的代码并且工作正常。

我有更新隐藏数据的代码。再次。别担心。

我想不通的是如何简单地获取触发器触发时所选节点的所有 child(和 granchild 等)节点。

如果我在最初单击节点时试图到达 children,我有点希望能够说出类似...

function doSomething(e)
{
    for(n=0; n<e.node.nodes.length; n++)
    {
        doSomethingElse(e.node.nodes[n]);
    }
}

但是好像没有这样的功能。

有人对我如何解决这个问题有什么建议吗?

您可以通过从 DOM 节点获得的模型访问子节点:

var dataItem = e.sender.dataItem(e.node);
if (dataItem.hasChildren) {
    var children = dataItem.children.data();
}

这只会让您直接获得子代,因此您必须使其递归才能获得所有后代。

(demo)

好的。

看来我可以像这样获取 TreeView 上的所有节点...

var allNodes = $(".k-item");

同样,我可以像这样获取给定节点的所有子节点...

// node is the node under which we need all of the child nodes
var childNodes = $(".k-item", node);

并且,对于 任何 给定节点,我可以像这样获取数据项...

var dataItem = tree.dataItem(node);

我相信只有在选定节点下的所有子节点的数据都已加载时,以上所有内容才成立。就我而言,我正在从远程数据加载(使用 AJAX),但我的网格定义中有 .LoadOnDemand(false)