在添加新节点后删除节点后,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 这显然对我很有帮助。