在添加新节点后删除节点后,kendoTreeView 不会重新呈现
The kendoTreeView is not getting re-rendered after node removal upon adding new node
有两个事件处理程序:一个向树中添加一个节点,另一个 - 删除它。它按预期工作正常,直到通过调用 "check" 事件删除节点。
这是一棵树(根据节点检查 - 它被删除):
$('#folderAttributeTree').kendoTreeView({
dataSource: this.attributeTree,
dataRole: "treeview",
dataTextField: "name",
checkboxes: true,
loadOnDemand: true,
check: function(e) {
var treeView = e.sender,
checkedNode = e.node;
treeView.remove(checkedNode);
},
dataBound: function(e) {
if (!this.dataSource.data().length) {
this.element.append("<li class='no-items'>No items yet.</li>");
} else {
this.element.find(".no-items").remove();
}
}
}).data("kendoTreeView");
这里是添加节点的方法(它总是创建嵌套元素):
addLabel: function(e) {
e.preventDefault();
var label = this.get('folder_label'),
folderAttributeTree = $("#folderAttributeTree").data("kendoTreeView"),
attributeTree = this.get('attributeTree')
data = [];
if (label !== null && label !== '') {
if (attributeTree.length) {
data = attributeTree;
var i = 0;
while (data.length) {
data = data[0].items;
i++;
}
data.push({
name: label,
type: 'folder',
expanded: true,
id: i,
items: [],
hasChildren: true,
itemIndex: 0
});
} else {
this.set('attributeTree', [{
name: label,
type: 'folder',
expanded: true,
id: 0,
items: [],
hasChildren: true,
itemIndex: 0
}]);
}
}
this.set('folder_label', '');
folderAttributeTree.setDataSource(this.attributeTree);
}
问题是,当我在删除节点后尝试添加节点时 - 树视图不再重新呈现(但是,如果我检查 console.log,数据将按应有的方式添加到对象中) .
我是 kendo-ui 的新手。请帮我解决这个问题。
提前致谢!
在将我的问题提交给 teleriks 支持人员后,他们给出了一个非常有用的提示,这让我找到了解决方案。
对于那些有类似问题的人,这里是解决方案:
addLabel: function(e) {
e.preventDefault();
var label = this.get('folder_label'),
folderAttributeTree = $("#folderAttributeTree").data("kendoTreeView"),
attributeTree = this.get('attributeTree');
if (label !== null && label !== '') {
if (attributeTree.length) {
var deepest = this.findDeepest(this.attributeTree[0]);
folderAttributeTree.append({
name: label,
type: 'folder',
expanded: true,
id: deepest.id + 1,
items: [],
hasChildren: true
}, $("#folderAttributeTree .k-item:last"));
} else {
this.set('attributeTree', kendo.observableHierarchy([{
name: label,
type: 'folder',
expanded: true,
id: 0,
items: [],
hasChildren: true
}]));
}
}
this.set('folder_label', '');
folderAttributeTree.setDataSource(viewModel.attributeTree);
}
有用的提示在于使用 .append
方法而不是 .push
我没有注意到 append 方法有第二个(可选)参数 parentNode
这显然对我很有帮助。
有两个事件处理程序:一个向树中添加一个节点,另一个 - 删除它。它按预期工作正常,直到通过调用 "check" 事件删除节点。
这是一棵树(根据节点检查 - 它被删除):
$('#folderAttributeTree').kendoTreeView({
dataSource: this.attributeTree,
dataRole: "treeview",
dataTextField: "name",
checkboxes: true,
loadOnDemand: true,
check: function(e) {
var treeView = e.sender,
checkedNode = e.node;
treeView.remove(checkedNode);
},
dataBound: function(e) {
if (!this.dataSource.data().length) {
this.element.append("<li class='no-items'>No items yet.</li>");
} else {
this.element.find(".no-items").remove();
}
}
}).data("kendoTreeView");
这里是添加节点的方法(它总是创建嵌套元素):
addLabel: function(e) {
e.preventDefault();
var label = this.get('folder_label'),
folderAttributeTree = $("#folderAttributeTree").data("kendoTreeView"),
attributeTree = this.get('attributeTree')
data = [];
if (label !== null && label !== '') {
if (attributeTree.length) {
data = attributeTree;
var i = 0;
while (data.length) {
data = data[0].items;
i++;
}
data.push({
name: label,
type: 'folder',
expanded: true,
id: i,
items: [],
hasChildren: true,
itemIndex: 0
});
} else {
this.set('attributeTree', [{
name: label,
type: 'folder',
expanded: true,
id: 0,
items: [],
hasChildren: true,
itemIndex: 0
}]);
}
}
this.set('folder_label', '');
folderAttributeTree.setDataSource(this.attributeTree);
}
问题是,当我在删除节点后尝试添加节点时 - 树视图不再重新呈现(但是,如果我检查 console.log,数据将按应有的方式添加到对象中) .
我是 kendo-ui 的新手。请帮我解决这个问题。
提前致谢!
在将我的问题提交给 teleriks 支持人员后,他们给出了一个非常有用的提示,这让我找到了解决方案。 对于那些有类似问题的人,这里是解决方案:
addLabel: function(e) {
e.preventDefault();
var label = this.get('folder_label'),
folderAttributeTree = $("#folderAttributeTree").data("kendoTreeView"),
attributeTree = this.get('attributeTree');
if (label !== null && label !== '') {
if (attributeTree.length) {
var deepest = this.findDeepest(this.attributeTree[0]);
folderAttributeTree.append({
name: label,
type: 'folder',
expanded: true,
id: deepest.id + 1,
items: [],
hasChildren: true
}, $("#folderAttributeTree .k-item:last"));
} else {
this.set('attributeTree', kendo.observableHierarchy([{
name: label,
type: 'folder',
expanded: true,
id: 0,
items: [],
hasChildren: true
}]));
}
}
this.set('folder_label', '');
folderAttributeTree.setDataSource(viewModel.attributeTree);
}
有用的提示在于使用 .append
方法而不是 .push
我没有注意到 append 方法有第二个(可选)参数 parentNode
这显然对我很有帮助。