大家晚上好,我知道这是使用较旧的堆栈;然而,在转移到具有更多功能的不同堆栈之前,这是我让某些东西正常工作的起点。
我有一个运行 ejs 模板的 Node.JS 应用程序,其中一个页面上有一个数据表,其中包含可显示的“子”行。这些子行中有几个按钮,其中一个按钮打开一个模型来显示一个表单,该表单将从 data.form_data 中的 JSON 对象填充。
我的模态 html 被通过以下方式拉入:
<%- include("../dataView/viewFullformModal") %>
我的所有数据都可以在“data”变量中找到。它正在渲染 data.formType、data.customer_name、data.dateReceived 等;但是,我需要包含另一个 ejs 文件,其中包含各种表单的特定布局。所以我认为最简单的方法是“if”或“switch”语句,这就是我遇到问题的地方:“data”变量可以访问 <% if statement.
我的if语句如下:
<% if ( data.formType === 'Schedule Consultation Form') { %>
'<p> yes </p>' +
<% } else { %>
console.log(data.formType) +
<% } %>
这将返回“未定义”;然而在此之前我有以下代码正在运行:
'formType: ' + formType + '</br>' +
这将返回:“formType:未定义”
并且,在这段代码之前,我有以下不起作用:
<% data.formType %>
这将返回:“NaN”
这是两个问题之一,但它是目前的主要问题。
这是我的主模板文件作为正文加载:dataTable.ejs
<div class="card">
<div class="card-header">Submitted Form Data</div>
<div class="card-body">
<div class="table-responsive">
<table id="customer_data" class="table table-bordered">
<thead>
<tr>
<th></th>
<th>Date Received</th>
<th>Form Type</th>
<th>Customer Name</th>
<th>Email</th>
<th>Form Status</th>
<th>Reviewed By</th>
</tr>
</thead>
<tfoot>
<tr>
<th></th>
<th>Date Received</th>
<th>Form Type</th>
<th>Customer Name</th>
<th>Email</th>
<th>Form Status</th>
<th>Reviewed By</th>
</tr>
</tfoot>
<tbody></tbody>
</table>
</div>
</div>
</div>
<script>
$(document).ready(function(){
function format ( data ) {
// `d` is the original data object for the row
console.log ( data.form_data);
console.log ( data.formType);
let formType = data.formType;
return '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
<%- include("../dataViews/childRowHeader") %>
<%- include("../dataViews/childRowDetails") %>
<%- include("../dataViews/childRowFormData") %>
// include Modals
<%- include("../dataViews/viewFullFormModal") %>
<%- include("../dataViews/addNotesModal") %>
<%- include("../dataViews/markReviewedNotesModal") %>
'</table>';
}
//let dataTable = $('#customer_data').DataTable({
let dataTable = new DataTable($('#customer_data'), {
'processing' : true,
'serverSide' : true,
'serverMethod' : 'get',
'ajax' : {
'url' : '/get_data'
},
'aaSorting' : [],
'columns' : [
{
className: 'dt-control',
orderable: false,
data: null,
defaultContent: ''
},
{ data : 'dateReceived' },
{ data : 'formType' },
{ data : 'customer_name' },
{ data : 'customer_email' },
{ data : 'form_status' },
{ data : 'reviewed_by' }
]
});
dataTable.on('click', 'td.dt-control', function (e) {
let tr = e.target.closest('tr');
let row = dataTable.row(tr);
if (row.child.isShown()) {
// This row is already open - close it
row.child.hide();
}
else {
// Open this row
row.child(format(row.data())).show();
}
});
});
</script>
<script src='../../assets/scripts/modalScript.js' type="application/json"> </script>
这是包含的viewFullFormModal.ejs
'<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">'+
'<div class="modal-dialog modal-dialog modal-xl" role="document">'+
'<div class="modal-content">'+
'<div class="modal-header">'+
'<h5 class="modal-title" id="exampleModalLabel"><strong>' + data.formType + '</strong> submitted by: ' + data.customer_name + ' on ' + data.dateReceived + '</h5>'+
'<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">'+
'<span aria-hidden="true">×</span>'+
'</button>'+
'</div>'+
'<div class="modal-body">'+
'formType: ' + data.formType + '</br>' +
'formType: ' + formType + '</br>' +
<% data.formType %> + '</br>' +
<% if ( data.formType === 'Schedule Consultation Form') { %>
'<p> yes </p>' +
<% } else { %>
'<br>' +
console.log(data.formType) +
<% } %>
'</div>' +
'<div class="modal-footer">'+
'<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>'+
'</div>'+
'</div>'+
' </div>'+
'</div>'+
'</div>'+
我可以删除整个“if”语句并包含以下文件(scheduleConsultationFormLayout.ejs),它会正确返回数据:
'<p>' +
'First Name: ' + data.form_data[4.3] + '</br>' +
'Last Name: ' + data.form_data[4.6] +
'</p>' +
遗憾的是,关于 EJS 的文档并不多,因此很难掌握它的某些方面。
关于你的问题,
formType
是undefined
或NaN
。
<% if ( data.formType === 'Schedule Consultation Form') { %>
'<p> yes </p>' +
<% } else { %>
console.log(data.formType) +
<% } %>
此代码片段中的问题出在 EJS 标签上。由于
viewFullFormModal.ejs
本质上是一个 HTML 文件(正常情况),因此它不知道如何处理 console.log(...)
。它既不在 EJS 标签内,也不在 script
内,因此 HTML 解析器仅将其视为文本。这个问题可以通过删除排除console.log(...)
的标签来解决,这样EJS解析器就可以运行console.log(...)
。<% if ( data.formType === 'Schedule Consultation Form') { %>
'<p> yes </p>' +
<% } else {
console.log(data.formType) +
} %>
'formType: ' + formType + '</br>' +
和以前一样,HTML解析器不知道
formType
,因此返回未定义,如果编写为,这将起作用
'formType: ' + <%= formType %> + '</br>' +
<% data.formType %>
有趣的是,可以在官方文档的几行文档中找到解决方案。
<%
是一个“scriplet”标签,这意味着它用于执行 if 语句、循环等。<%=
是一个“输出”标签,意思是它是用来输出字符串的
因此,要输出 formType,您需要将其写为
<%= data.formType %>
我觉得你的做法很奇怪,那就是
viewFullFormModal.ejs
。为什么每一行都用撇号括起来?您可以像往常一样编写 ejs 文件,然后,当您包含该文件时,使用 <%-
它将以字符串形式返回输出。在大多数(如果不是全部)IDE 中,即使它有效,这也会被标记为错误。要消除该错误,只需将整个 EJS 部分包装在字符串分隔符中,即 "
引号、'
撇号或 `
gravis。我更喜欢 gravis,因为引号和撇号已经可能在文件内使用,所以它会弄乱字符串的分隔符。