gpt4 book ai didi

javascript - Kendo Treeview - 如何在另一个 Treeview 中显示具有所有父节点的选定节点

转载 作者:行者123 更新时间:2023-12-03 22:52:06 28 4
gpt4 key购买 nike

我有一个带有复选框和父节点和子节点的 Kendo Treeview 。
我需要将选中节点的完整层次结构复制到另一个 Treeview 中。
ex - 根节点、父节点和选中的子节点。

下面是我的代码,但我只能显示子节点及其父节点。我还需要根节点,每次我选择子节点时,如果已经选择了父节点和根节点,则需要附加它

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled</title>

<link rel="stylesheet" href="http://kendo.cdn.telerik.com/2017.2.504/styles/kendo.common.min.css">
<link rel="stylesheet" href="http://kendo.cdn.telerik.com/2017.2.504/styles/kendo.rtl.min.css">
<link rel="stylesheet" href="http://kendo.cdn.telerik.com/2017.2.504/styles/kendo.default.min.css">
<link rel="stylesheet" href="http://kendo.cdn.telerik.com/2017.2.504/styles/kendo.mobile.all.min.css">

<script src="http://code.jquery.com/jquery-1.12.3.min.js"></script>
<script src="http://kendo.cdn.telerik.com/2017.2.504/js/angular.min.js"></script>
<script src="http://kendo.cdn.telerik.com/2017.2.504/js/jszip.min.js"></script>
<script src="http://kendo.cdn.telerik.com/2017.2.504/js/kendo.all.min.js"></script>

<style>
#treeview-left,
#treeview-right
{
float: left;
width: 220px;
overflow: visible;
}
.demo-section {
width: 500px;
}
.demo-section:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
</style>

</head>
<body>
<div class="demo-section k-header">

<div id="treeview-left"></div>

<div id="treeview-right"></div>
</div>

<button id="copy-nodes" class="k-button">Copy nodes</button>

<script>

$("#treeview-left").kendoTreeView({
dragAndDrop: true,
dataSource: [{
"text": "RootNode",
"expanded": true,
"items": [{
"text": "Furniture",
"expanded": true,
"items": [{
"text": "Tables & Chairs"
},
{
"text": "Sofas"
},
{
"text": "Occasional Furniture"
}
]
},
{
"text": "Decor",
"items": [{
"text": "Bed Linen"
},
{
"text": "Curtains & Blinds"
},
{
"text": "Carpets"
}
]
}
]
}],
checkboxes: {
checkChildren: true
},
check: onCheck
});

$("#treeview-right").kendoTreeView({});

function onCheck(e) {
e.preventDefault();
var checkedNodeParentItem = this.dataItem(this.parent(e.node)).toJSON(),
checkedNodeParentItemItems = checkedNodeParentItem.items;

var treeviewTarget = $("#treeview-right").data("kendoTreeView"),
treeviewTargetItems = treeviewTarget.dataItems().toJSON();

var parentExists = false;
for (var j = 0; j < treeviewTargetItems.length; j += 1) {
var currentItem = treeviewTargetItems[j];

if (currentItem.text == checkedNodeParentItem.text) {
parentExists = true;
break;
}
}

if (parentExists) {
var target = treeviewTarget.findByText(checkedNodeParentItem.text);
var node = this.dataItem(e.node);

treeviewTarget.append(node, target);

} else {
var clonedParent = $.extend({}, checkedNodeParentItem);
clonedParent.items = [];
var checkedItems = [];
for (var i = 0; i < checkedNodeParentItemItems.length; i += 1) {
var isChecked = checkedNodeParentItemItems[i].checked;

if (isChecked) {
clonedParent.items.push(checkedNodeParentItemItems[i]);
}
}
treeviewTarget.append(clonedParent)
}
}

</script>
</body>
</html>

最佳答案

我建议对第二个 Treeview 使用单独的 DataSource,将数据复制到它并启用过滤。

完整的工作代码在这里 http://dojo.telerik.com/oqIXa/2

基本部分是通过扩展所有节点和剥离源可观察对象将源数据复制到目标:

 function onCheck(e) {
// toJSON is to strip Observable and decouple two datasources
var sourceData = treeView.dataSource.data().toJSON();

expandNodes(view);

treeViewRight.setDataSource(new kendo.data.HierarchicalDataSource({
data: sourceData,
filter: {field: "checked", operator: "eq", value: true }
}));
}

然而,有一个小问题——如果 Decor 节点最初没有展开并且你选择了它,它的行为真的很奇怪。似乎折叠项目的数据最初并未加载,这会导致一些奇怪的效果。如果您需要最初折叠的树项目,您应该进一步调查这一点。
 text: "Decor",  items: ...

关于javascript - Kendo Treeview - 如何在另一个 Treeview 中显示具有所有父节点的选定节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44422710/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com