PHP带编辑功能页面:Mustache模板下拉选单渲染出错求助
解决下拉选单重复渲染与选中值错误问题
问题根源
你的模板存在两个核心问题:
- 多嵌套了一层
{{#score_list}}循环——你的数据源本身就是包含5条记录的数组,直接循环该数组即可,额外的嵌套循环导致0-15的选项被重复渲染5次。 - 选中值判断逻辑错误——
{{#selected}}是判断当前上下文是否为真,但你的selected是具体数值(如2、8)或false,并非布尔上下文,直接使用会导致无法匹配对应分数的选中状态。
正确模板代码
假设你使用的是Handlebars类模板引擎,调整后的模板如下:
{{#each this}} <select name="score[{{id}}]" id="score-{{id}}"> {{#each scores}} <option value="{{.}}" {{if (eq . ../selected)}}selected{{/if}}>{{.}}</option> {{/each}} </select> {{/each}}
细节说明
{{#each this}}:直接循环你的数据源数组(每条记录),this指代整个数据源。{{#each scores}}:循环当前记录的scores数组生成独立选项。{{if (eq . ../selected)}}selected{{/if}}:通过eq辅助函数判断当前分数(.)是否等于外层记录的selected值(../selected跳出当前scores上下文,回到父级记录上下文),相等则添加selected属性。
兼容方案(若模板引擎不支持eq辅助函数)
如果你的模板引擎是原生Mustache这类不支持复杂判断的,可以提前在后端处理数据:
foreach($data as &$item) { $processedScores = []; foreach($item['scores'] as $score) { $processedScores[] = [ 'value' => $score, 'isSelected' => $score == $item['selected'] ]; } $item['scores'] = $processedScores; }
之后模板改为:
{{#each this}} <select name="score[{{id}}]" id="score-{{id}}"> {{#each scores}} <option value="{{value}}" {{#if isSelected}}selected{{/if}}>{{value}}</option> {{/each}} </select> {{/each}}
特殊情况处理
当selected为false时,上述逻辑会自动跳过选中状态,符合需求。
内容的提问来源于stack exchange,提问作者Andrewboy
相关产品推荐
相关产品推荐

