【问题标题】:Jstree - extra classes added to the node getting lost upon collapsingJstree - 添加到节点的额外类在折叠时丢失
【发布时间】:2015-08-08 07:33:44
【问题描述】:

我正在创建一个基于权限的淘汰赛 JS jsTree,我从 observableArray 中提取树数据。我想在单击时以及在页面加载时基于 JSON 添加/撤销对文件夹和子文件夹的权限。但是由于树每次折叠时都会重新渲染,因此添加的类会丢失。我在现有精灵中添加了一个带有关闭图标的额外精灵图像,并在单击时更改精灵位置。 (无法发布屏幕截图,因为我没有发布图像的最低声誉)。文件夹也可以有深度嵌套。

当前 jsTree(其中 X 表示新文件夹图标)

-X Reports library
  - X Archives
- My Reports

/* 再次折叠和展开时:*/

 -X Reports library
   - Archives
 - My Reports

最初的淘汰 js 树已经使用这个fiddle 的变体完成

页面加载时,我需要根据 JSON 中的权限(真/假)设置图标。我也可以在 json 中添加权限:真属性。另外,我需要切换一个文件夹,该文件夹及其子文件夹应切换指示权限已撤销的文件夹图标。

self.tree.on("changed.jstree", function (e, data) {
    var node = self.tree.jstree().get_selected(true)[0]; //get current selected node    

        var selId = "#"+ node.a_attr.id;
        $(selId).toggleClass("permission-icon");
        var nextItem = $(selId).next();
        var nextListItemFlag = $(selId).next().hasClass("jstree-children");

        if(nextListItemFlag){
            $(nextItem).children().each(function(){ 
                $(this).find(".jstree-icon.jstree-themeicon").toggleClass("custom-permission-icon");
            });             
        }

    if (typeof node !== 'undefined') {
        self.isNodeSelected(true);
        self.selectedNode(node);
        self.myinfo(node.original.folderdata);                      
        } else {
        self.isNodeSelected(false);
    }
});

self.treeData = ko.observableArray(
[{
    'id': 1,
    'parent': '#',
    'text': 'Reports Library',
    'state': {
        selected: false         
    },
    'type': '#',        
    'folderdata': [{name: "Reports", type: "folder", modified: "07-02-2015", size: "10 KB"},
                   {name: "New text doc", type: "text", modified: "07-02-2015", size: "20 KB"},
                   {name: "test.pptx", type: "pptx", modified: "07-02-2015", size: "39 KB"},
                   {name: "test.xlsx", type: "excel", modified: "07-02-2015", size: "50 KB"}
                  ],

    }, {
    'id': 2,
    'parent': '#',
    'text': 'Reports Archive',      
    'type' : '#',
    'folderdata': [{name: "Meetings", type: "folder", modified: "07-02-2015", size: "10 KB"},
                   {name: "logs", type: "text", modified: "07-02-2015", size: "20 KB"},
                   {name: "sessions", type: "pptx", modified: "07-02-2015", size: "39 KB"},
                   {name: "worklog", type: "excel", modified: "07-02-2015", size: "50 KB"}
                  ],
    }, {
    'id': 'dog',
    'parent': 1,
    'text': 'Reports',      
    'type' : 'folder'
}]

任何帮助将不胜感激!已经在这件事上卡了一天了:(

【问题讨论】:

    标签: knockout.js jstree collapse expand


    【解决方案1】:

    jsTree 仅在 DOM 中保留可见节点,因此一旦节点折叠然后重新打开 - 它的所有子节点都会从内部 JSON 表示重新加载 - 如果您没有修改它,您对 DOM 节点所做的任何更改都会丢失.

    基本上如果你想添加一个类,你会做这样的事情(这是针对LI节点的,你当然也可以修改A节点):

    .on('changed.jstree', function (e, data) {
        // DOM
        data.instance.get_node(data.selected[0],true).addClass('newClass');    
        // internal model
        data.instance._model.data[data.selected[0]].li_attr.class += ' newClass';
    });
    

    图标也是如此——有一种处理图标变化的方法——set_icon

    【讨论】:

    • 非常感谢 vakata 的快速响应!我以前看过很多你的解决方案! :) 让我试试上面提到的解决方案,看看它是否有效。在发帖之前,infact ive 在 stackoverflow 中搜索了很多类似的 jsTree expand -re 渲染问题。 link。感谢您的快速响应!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2018-07-22
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多