更新后的JSON无法更新jstree,求助问题排查
jstree渲染异常问题排查与修复
问题根源
- JSON包含无效元素:返回的JSON数组开头有个
0,这不是jstree可识别的节点结构,直接破坏了树形渲染逻辑。jstree要求每个数组元素必须是包含id、parent、text的对象。 - 全局变量导致数据污染:后端用了全局变量
$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
相关产品推荐
相关产品推荐

