使用选定的 HTML 选项重新呈现表单
re-render form with selected HTML option
我有一个表单,如果有任何错误,它会重新呈现,并且它会根据任何有效输入重新呈现。我还想在 < select > 元素中使用 selected 选项重新呈现表单,但我正在努力
// controller.js
(req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
res.render("quotes", {
form: req.body,
errors: errors.array(),
yes: 'selected'
});
return;
// quotes.ejs
<label for="propertyType">Type of Property</label> <br />
<select name="propertyType">
<option value="Building Lot">Building Lot</option>
<option value="Condo - Appartment">Condo - Appartment</option>
<option value="Co-op">Co-op (Owned)</option>
<option value="Duplex">Duplex</option>
// my poor solutions below
<option selected value="<%= locals.form? form.propertyType : '' %>"><%= locals.form? form.propertyType : '' %></option>
<option value="Single Family Home" <% if (locals.errors) { %> selected="<%- yes %>" <% } %>>Single Family Home</option>
</select>
我最接近的解决方案在最后 2 个
如有任何帮助,我们将不胜感激!谢谢:)
最好的解决方案是 post 您通过 AJAX 请求。这样您就不会重新呈现页面,并且可以保留您的输入数据。
既然你选择了re-render选项,我能想到的最优雅的方式就是通过客户端javascript。
首先,在你的控制器函数中,return selected 输入值
if (!errors.isEmpty()) {
res.render("quotes", {
selected: req.body.propertyType,
errors: errors.array()
});
....
在 quotes.ejs 里面,你只需添加一个小脚本
// html code
<label for="propertyType">Type of Property</label> <br />
<select name="propertyType">
<option value="Building Lot">Building Lot</option>
<option value="Condo - Appartment">Condo - Appartment</option>
<option value="Co-op">Co-op (Owned)</option>
<option value="Duplex">Duplex</option>
</select>
// html code
<% if (locals.errors) { %>
// the following will run only if errors exist
<script>
var selectedInput = "<%= selected %>";
var options = document.querySelector('[name="propertyType"]');
for (var i = 0; i < options.length; i++) {
if (selectedInput === options[i].value) {
options[i].selected = 'selected';
break;
}
}
</script>
<% } %>
如果出现任何呈现错误,脚本将 运行。它循环 select 输入的选项,并检查选项值是否等于提交的值。如果为真,则选项 selected.
我有一个表单,如果有任何错误,它会重新呈现,并且它会根据任何有效输入重新呈现。我还想在 < select > 元素中使用 selected 选项重新呈现表单,但我正在努力
// controller.js
(req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
res.render("quotes", {
form: req.body,
errors: errors.array(),
yes: 'selected'
});
return;
// quotes.ejs
<label for="propertyType">Type of Property</label> <br />
<select name="propertyType">
<option value="Building Lot">Building Lot</option>
<option value="Condo - Appartment">Condo - Appartment</option>
<option value="Co-op">Co-op (Owned)</option>
<option value="Duplex">Duplex</option>
// my poor solutions below
<option selected value="<%= locals.form? form.propertyType : '' %>"><%= locals.form? form.propertyType : '' %></option>
<option value="Single Family Home" <% if (locals.errors) { %> selected="<%- yes %>" <% } %>>Single Family Home</option>
</select>
我最接近的解决方案在最后 2 个
如有任何帮助,我们将不胜感激!谢谢:)
最好的解决方案是 post 您通过 AJAX 请求。这样您就不会重新呈现页面,并且可以保留您的输入数据。
既然你选择了re-render选项,我能想到的最优雅的方式就是通过客户端javascript。
首先,在你的控制器函数中,return selected 输入值
if (!errors.isEmpty()) {
res.render("quotes", {
selected: req.body.propertyType,
errors: errors.array()
});
....
在 quotes.ejs 里面,你只需添加一个小脚本
// html code
<label for="propertyType">Type of Property</label> <br />
<select name="propertyType">
<option value="Building Lot">Building Lot</option>
<option value="Condo - Appartment">Condo - Appartment</option>
<option value="Co-op">Co-op (Owned)</option>
<option value="Duplex">Duplex</option>
</select>
// html code
<% if (locals.errors) { %>
// the following will run only if errors exist
<script>
var selectedInput = "<%= selected %>";
var options = document.querySelector('[name="propertyType"]');
for (var i = 0; i < options.length; i++) {
if (selectedInput === options[i].value) {
options[i].selected = 'selected';
break;
}
}
</script>
<% } %>
如果出现任何呈现错误,脚本将 运行。它循环 select 输入的选项,并检查选项值是否等于提交的值。如果为真,则选项 selected.