You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新后的JSON无法更新jstree,求助问题排查

jstree渲染异常问题排查与修复

问题根源

  1. JSON包含无效元素:返回的JSON数组开头有个0,这不是jstree可识别的节点结构,直接破坏了树形渲染逻辑。jstree要求每个数组元素必须是包含id、parent、text的对象。
  2. 全局变量导致数据污染:后端用了全局变量$data,每次请求都会往里面追加新节点,导致返回的JSON是多次请求数据的累加(那个0大概率是之前请求遗留的无效数据)。

修复步骤

后端代码修正

替换全局变量为局部变量避免数据残留,同时检查Node类的初始化逻辑,确保生成的节点格式正确:

def sources
    @disease_code_id = params[:disease_code_id]
    @phase_name = params[:phase_id]
    @phase_id = RecruitmentPhase.select('recruitment_phases.phase_id').where('recruitment_phases.phase_name = ?', @phase_name)
    
    @sources = QuestionnaireItem.joins('join traits on traits.trait_id = questionnaire_items.trait_id join trait_groups on trait_groups.trait_id = traits.trait_id join sources on sources.source_id = traits.source_id join disease_phaseid_questionnaires on disease_phaseid_questionnaires.questionnaire_id = questionnaire_items.questionnaire_id join recruitment_phases on disease_phaseid_questionnaires.phase_id = recruitment_phases.phase_id').where('disease_phaseid_questionnaires.disease_code_id = ? and disease_phaseid_questionnaires.phase_id = ?', @disease_code_id, @phase_id.first.phase_id).where.not(:recruitment_phases => {phase_name:nil}).select('distinct sources.source_name', 'sources.source_id', 'recruitment_phases.phase_name', 'recruitment_phases.phase_id')
    
    # 用局部变量替代全局变量,每次请求重新初始化
    data = []
    @sources.each { |x| data.push(Node.new(x.source_name.strip, @phase_name.chomp, x.source_name.strip))}
    
    respond_to do |format|
      format.html
      format.js
      format.json { render json: data.flatten}
    end
end

注意:检查Node类的实现,确保它返回的是标准的节点哈希(包含id、parent、text字段),不要生成额外的无效值。

前端代码优化(可选)

确保jstree实例存在后再更新数据,写法更健壮:

function nextCall(phase_id, disease_code_id){
    $.ajax({
        url: `source/${phase_id}/${disease_code_id}`,
        dataType:'json',
        type:'GET',
        success: function (data) {
            const treeInstance = $('#using_json_2').jstree(true);
            if(treeInstance){
                treeInstance.settings.core.data = data;
                treeInstance.refresh();
            }
        }
    });
}

验证标准

修复后返回的JSON应该是纯节点对象数组,示例如下:

[
    {
        "id": "Follow-up 4",
        "parent": "#",
        "text": "Follow-up 4"
    },
    {
        "id": "Baseline",
        "parent": "#",
        "text": "Baseline"
    },
    {
        "id": "question form popgen",
        "parent": "Baseline",
        "text": "question form popgen"
    }
]

此时jstree就能正常渲染树形结构。

内容的提问来源于stack exchange,提问作者raghu palakodety

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:55:21