如何在SurveyJS矩阵下拉组件中根据行数据动态渲染HTML列内容
如何在SurveyJS矩阵下拉组件中根据行数据动态渲染HTML列内容
我之前也碰到过类似的需求,SurveyJS的MatrixDropdown组件里的HTML单元格默认没法直接通过{row.pattern}这种占位符来绑定行内的动态HTML内容,不过我们可以借助组件的渲染事件来完美解决这个问题,具体步骤如下:
解决方案:利用onAfterRenderCell事件动态注入HTML
SurveyJS提供了onAfterRenderCell事件,它会在每个矩阵单元格渲染完成后触发,我们可以在这个事件里精准定位到目标列,然后把对应行的HTML内容插入进去。
1. 调整矩阵配置(保留核心结构,简化HTML列配置)
首先,我们可以把原来pattern列的html属性留空或者设为默认占位文本,因为后续事件会覆盖这部分内容:
const matrix_dynamic_html = { "elements": [ { type: "matrixdropdown", name: "Test", title: "my_title", description: "my_pattern", columns: [ { name: "pattern", title: "Pattern", cellType: "html", html: "" // 留空,后续通过事件填充 }, { name: "response", title: "response", cellType: "radiogroup", "choices": [ { "value": 0, "text": "Incorrect" }, { "value": 1, "text": "Correct" } ], "showInMultipleColumns": true, "colCount": 1 } ], rows: [ { value: "question_1", text: "This is question 1.", pattern: generate_html("ques_1"), }, { value: "question_2", text: "This is question 2.", pattern: generate_html("ques_2"), }, { value: "question_3", text: "This is question 3.", pattern: generate_html("ques_3"), }, { value: "question_4", text: "This is question 4.", pattern: generate_html("ques_4"), } ], rowTitleWidth: "50%", } ], "showQuestionNumbers": false };
2. 注册onAfterRenderCell事件处理器
在创建Survey实例后,注册这个事件,判断当前渲染的单元格是否是我们目标矩阵的pattern列,然后将对应行的HTML内容插入到单元格中:
// 假设你已经创建了Survey实例 const survey = new Survey.Model(matrix_dynamic_html); // 注册渲染事件 survey.onAfterRenderCell.add(function (sender, options) { // 精准匹配目标矩阵和目标列 if (options.question.name === "Test" && options.column.name === "pattern") { // 获取当前行预先生成的HTML内容 const dynamicHtml = options.row.pattern; // 将HTML插入到单元格的DOM元素中 options.htmlElement.innerHTML = dynamicHtml; } });
3. 验证generate_html函数
确保你的generate_html函数返回的是有效的HTML字符串,比如:
function generate_html(quesId) { // 根据问题ID返回不同的HTML结构(示例) switch(quesId) { case "ques_1": return '<div style="border: 1px solid #ccc; padding: 8px; background: #f5f5f5;">Pattern 1: <span style="color: red; font-weight: bold;">★</span></div>'; case "ques_2": return '<div style="border: 1px solid #ccc; padding: 8px; background: #f5f5f5;">Pattern 2: <span style="color: blue; font-weight: bold;">●</span></div>'; case "ques_3": return '<div style="border: 1px solid #ccc; padding: 8px; background: #f5f5f5;">Pattern 3: <span style="color: green; font-weight: bold;">▲</span></div>'; case "ques_4": return '<div style="border: 1px solid #ccc; padding: 8px; background: #f5f5f5;">Pattern 4: <span style="color: purple; font-weight: bold;">■</span></div>'; default: return '<div>Default Pattern</div>'; } }
为什么原来的方法不生效?
SurveyJS的MatrixDropdown组件中,HTML单元格的html属性默认是静态字符串,组件不会自动解析其中的{row.pattern}这类行数据占位符,所以必须通过渲染事件来手动注入动态内容。
备注:内容来源于stack exchange,提问作者G. Frischkorn
相关产品推荐
相关产品推荐

