【问题标题】:Kendo UI Treeview Sprite-Altering TemplateKendo UI Treeview Sprite-Altering 模板
【发布时间】:2012-11-29 15:44:13
【问题描述】:

我有一个绑定到远程分层数据源(JSON 文件)的剑道 Treeview。

我想根据节点是什么在每个节点旁边添加精灵。如果节点没有子节点,那么我希望它具有“文件”精灵,如果节点有子节点,我想要它拥有“文件夹”精灵。(精灵来自剑道,演示中的精灵)

我对模板的工作方式有点困惑,我可以使用模板动态更改每个节点的精灵吗?任何好的例子和一些解释让我继续前进会有很大帮助。

谢谢

【问题讨论】:

  • 如果只是为了显示图标,使用spriteCssClass是不够的。节点示例:{ text:"node1.3", spriteCssClass:"k-icon k-i-pencil" }。为什么需要模板?
  • 我需要它们,因为我希望新节点也有适当的精灵。我希望这可以自动完成,这样我就不必检查并在每个节点上添加 spriteCssClass数据源每次..

标签: templates kendo-ui kendo-treeview


【解决方案1】:

在下面的代码中,我要做的是定义一个template,它检查正在渲染的节点是否有items(子节点)。如果有,它会显示默认 sprite 文件 (k-i-plus) 中的 icon,否则会显示不同的图标 (k-i-refresh)。

function loadMore() {
    var uuid = $(this).data("uid");
    var node = tree.findByUid(uuid);
    tree.insertBefore(content, node);
    tree.remove(node);
    tree.expand(".k-item");
    addLoadMore(".k-i-refresh");
}

function addLoadMore(clss) {
    $(clss, tree.element).closest(".k-item").on("click", loadMore);
}

var content = [
    {
        text :"node1",
        items:[
            { text:"node1.1" },
            { text:"node1.2" },
            { text   :"node1.3",
                items:[
                    { text:"node1.3.1" },
                    { text:"node1.3.2" },
                    { text:"node1.3.3" },
                    { text:"node1.3.4" }
                ] },
            { text:"node1.4" }
        ]
    }
];

var tree = $("#tree").kendoTreeView({
    dataSource:content,
    template  :"<span class='k-icon #= item.items ? 'k-i-plus' : 'k-i-refresh' #'></span>#= item.text #"
}).data("kendoTreeView");
tree.expand(".k-item");
addLoadMore(".k-i-refresh");

如果将k-i-plus 替换为定义folder 的CSS 类名,并将k-i-refresh 更改为文件的CSS 类名,您需要做什么。

如果您需要有关编写模板的信息,here 中有一个很好的文档。

【讨论】:

  • 好的,所以我对其进行了一些修改,因为正如我们之前看到的那样,kendo 会自动在每个节点中添加 items 字段。但是好的,我已经让它工作了,问题是如果我添加一个节点它应该有文件图像,如果我向该节点添加一个子节点,文件图像不会自动成为文件夹图像!有没有办法连续运行模板而不仅仅是在树视图初始化上??
  • 严格来说,不是初始化treeview的时候,而是添加节点的时候。所以,我修改了上面的代码,动态地将节点添加到具有k-i-refresh 图标的节点,但它是用insertBefore 加上remove 而不是append 实现的。
  • 似乎我不必添加另一个函数,我所要做的就是在 appendNode 上添加 treeview.dataSource.sync() 并且 removeNode 函数和精灵会根据条件自动更新节点!再次感谢您的帮助! :)
  • Hmmm .sync() 不能与数据源一起正常工作,并且滞后于其余功能。我认为如果我更改节点的 text 值,精灵就会刷新!是有一种方法可以在每次追加、删除、拖动时手动“重新运行”模板吗?因为当我附加一个孩子时我似乎没有“跑”,你说它应该是对的?
  • 当我说它也是当您添加节点时,我的意思是您添加的节点而不是父节点。这个想法是,模板仅在第一次渲染节点时运行。这就是为什么我无法追加但我生成了我想要追加的节点的副本,然后将子节点添加到此副本,然后调用 insertBefore 插入副本并最终删除旧副本。
【解决方案2】:

我知道我迟到了 3 年以上。但万一有人遇到同样的问题。这是我实现它的方法:

    schema: {
        model: {
            children: "folder",
            hasChildren: function (node) {
                var hasChildren =  (node.folder && node.folder.length > 0);
                if (hasChildren === true) {
                    node.spriteCssClass = "folder";
                } else {
                    node.spriteCssClass = "html";
                }
                return hasChildren;
            }
        }
    }

【讨论】:

  • hasChildren“节点”未显示,能否显示更多代码
猜你喜欢
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多