如何在EJS中dynamic添加选项标签?

我觉得这是蛮横的,正是EJS试图阻止的。 有没有一种方法来增加价值和选项,而不是串联一个循环string?

<!-- developer field option values --> <% var optionstring = ""; for (var i = 0; i < developers.length; i++){ optionstring += '<option value="' + developers[i]._id + '">' + developers[i].firstname } %> <% for (var i = 0; i < users.length; i++){ %> <tr> <td><%= users[i].firstname %></td> <td><select class="assign_dev"><option value="unassigned">unassigned<%- optionstring %></select></td> <td><select class="ticket_status"><option value="open">Open</option><option value="closed">Closed</option></select></td> </tr> 

如果你的目标是避免连接string,那么你可以closures代码块,插入html,然后重新打开代码块。

 <% for (var i = 0; i < users.length; i++){ %> <tr> <td><%= users[i].firstname %></td> <td> <select class="assign_dev"> <option value="unassigned">unassigned</option> <% for (var j = 0; j < developers.length; j++){ %><option value="<%= developers[j]._id %>"><%= developers[j].firstname %><% } %> </select> </td> <td> <select class="ticket_status"> <option value="open">Open</option> <option value="closed">Closed</option> </select> </td> </tr> %> 

但是,我不认为真正的目标应该是避免串联。 目标应该是使代码清晰有效(只要效率不会牺牲清晰度)。 在我看来,你的原始代码更好。 由于您需要反复列出相同的选项,因此在前面的循环中创build一次列表,然后在第二个循环中重新使用该caching的string比嵌套循环更高效更清晰。

你可以select没有循环的选项。 我使用Array.prototype.map函数来处理每个项目(请参阅下面的示例)

 <select id="developer" name="developer"> <option id="0"> Please choose a developer </option> <% developers.map(item=> { %> <option id="<%= item._id%>"> <%= item.firstname %> </option> <% }) %> <select>