【问题标题】:Get EJS value based on the Javascript variable根据 Javascript 变量获取 EJS 值
【发布时间】:2021-05-06 17:07:35
【问题描述】:

我正在尝试使用 express、ejs 和 MongoDB 构建一个预约网站。 当请求发送到“/booking”时,会显示包含医生的所有详细信息的书页。对于每个点击书籍按钮的医生,都会动态添加一个表格。一个 js 事件被添加到 book 按钮,以便当用户单击该按钮时,可以使用 ajax 访问该特定的医生 ID 并将其发送回服务器。我的基本想法是当按钮为 'i' 时单击并从 doctprs 数组中获取特定“i”索引处的医生 ID 值。但是 ejs 会在 javascript 之前加载,所以我无法做到这一点。请帮我获取所选医生ID的值。

更新 在 div id="myCalendar" 的表单中,我正在显示一个日历,用户可以从中选择日期。 我想获取用户选择的医生 ID,然后使用 axios 请求将其发送到服务器,然后获取该特定医生在该特定日期的时间段并将其显示在表单中,以便用户可以选择特定时间为该日历安排并在当天预约。

app.js

app.get("/booking",function(req,res){
  Doctor.find().populate('doctor_id','name id').populate('hospital_id').then((doctors,err)=>{
    res.render("book",{doctor:doctors});
  }).catch(err=>   req.flash('error',"Something went wrong!Try again!"));
}); 
app.post("/time_slots",function(req,res){
 
  items=Appointment.find({doctor_id: mongoose.Types.ObjectId(req.body.doctor), appointment_date:new Date(req.body.app_date)}).then((slots,err)=>{
    let data=JSON.stringify(slots);
    console.log(req.body.doctor+" "+req.body.app_date);
    console.log(slots);
   return res.json({slots: data})
  }).catch(err=>   req.flash('error',"Something went wrong!Try again!"))
});

book.ejs

<% for(i=0;i<doctor.length;i++){ %>
  <div id="details<%= i %>">
   <%= doctor[i].doctor_id['id'] %>
   <%= doctor[i].doctor_id['name'] %>
   <%= doctor[i].speciality %>
   <%= doctor[i].experience %>
   <%= doctor[i].hospital_id.name %>
   <%= doctor[i].hospital_id.location %>
   <button  class="btn btn-success booking_btn" id="<%= i %>">Book</button>
   <br><br><br>
  </div>
   <% } %>  
<script>
 
 var buttons= document.getElementsByClassName("booking_btn");
 for(let i = 0; i <buttons.length; i++) {
   buttons[i].addEventListener("click", function() {

   var booking_form=` <form action="/booking" method="post" id="book-appointment-form">
    <div id="myCalendar" class="vanilla-calendar" value=""></div>
    <div id="boxes"></div>
    <button type="submit" class="btn btn-success">Confirm</button>
    </form>`
    document.getElementById("details"+i).insertAdjacentHTML( 'beforeend', booking_form);
    createCalendar();
    sendSelectedDate(i);
   })
 }

 function createCalendar(){
  calendarSet=true;
 myCalendar = new VanillaCalendar({
 selector: "#myCalendar",
 pastDates: false,
 availableWeekDays: [
   {day: 'monday'},
   {day: 'tuesday'},
   {day: 'wednesday'},
   {day: 'thursday'},
   {day: 'friday'}
 ], 
 datesFilter: true
});

}
 function sendSelectedDate(i){
  let date_selected = document.getElementById("myCalendar");
  document.getElementsByClassName("vanilla-calendar-body")[0].addEventListener("click", function(e) {
  e.preventDefault();
  var t=<%= doctor[i].doctor_id['id'] %>
  var d =new Date(date_selected.value).toLocaleDateString('ko-KR').slice(0, -1).replaceAll('. ','-');
  axios.post('/time_slots', {app_date: d,doctor: t}).then(function (response) {
    var $section = $('<div class="col-md-4"></div>');
  (JSON.parse(response.data.slots)).forEach(function(slot) {
    $section.append(`<button>${slot.time_slot}</button>`);
  });
  $('#boxes').html($section);
    }).catch(function(e) {
    console.log(e);
    console.log("Please try again later.");
  })
})
 }
</script>

【问题讨论】:

  • 一项更正和一项建议: 更正:您在循环book-appointment-form 中分配id 属性。 Id 属性旨在是唯一的。建议:使用事件委托而不是许多、许多重复的事件处理程序。阅读What is DOM event delegation?
  • 嘿@RandyCasburn 感谢您的回复,我现在发布了完整的代码。

标签: javascript jquery node.js express ejs


【解决方案1】:

您可以像这样将onclick 事件单独添加到每个按钮:

<% for(i=0;i<doctor.length;i++){ %>
  <div id="details<%= i %>">
   <%= doctor[i].doctor_id['name'] %>
   <%= doctor[i].speciality %>
   <%= doctor[i].experience %>
   <%= doctor[i].hospital_id.name %>
   <%= doctor[i].hospital_id.location %>
   <button  class="btn btn-success booking_btn" id="<%= i %>" onclick="yourFunction(<%= i %>)" >Book</button>
   <br><br><br>
  </div>
<% } %>  
<script>
//Your function here
function yourFunction(i) {
    //Your code here
}
</script>

【讨论】:

  • OP 已经在他们的代码中做到了这一点。他们只是采取了与您不同的方法。
  • 此外,OP 的方法比您的建议更好,因为不鼓励使用 in-line 事件处理程序。
  • 您好,谢谢您的回复。我能够访问 i 值,问题是我无法获得 t 值(var t= ),因为在单击之前加载了 t 值按钮,我认为是因为它是一个 ejs 代码所以我得到一个错误。
  • 我在我的网站上遇到了同样的问题,它解决了问题。
  • 嘿@Uri 我试过这个,对我不起作用,还有其他想法 Uri 吗?
【解决方案2】:

如果您通过使用数据集将医生 ID 分配给循环中的按钮,我会起作用:

  1. 将医生 ID 分配给按钮
<button class="btn btn-success booking_btn" data-doctor-id="<%= doctor[i].doctor_id['id'] %>" id="<%= i %>">Book</button>
  1. 检索医生ID并设置为myCalendar数据:
var doctorId = buttons[i].dataset.doctorId
var booking_form=` <form action="/booking" method="post" id="book-appointment-form">
<div id="myCalendar" class="vanilla-calendar" data-doctor-id="${ doctorId }"></div>
...
  1. 使用sendSelectedDate方法中的医生ID:
var t=date_selected.dataset.doctorId

book.ejs

<% for(i=0;i<doctor.length;i++){ %>
  <div id="details<%= i %>">
   <%= doctor[i].doctor_id['id'] %>
   <%= doctor[i].doctor_id['name'] %>
   <%= doctor[i].speciality %>
   <%= doctor[i].experience %>
   <%= doctor[i].hospital_id.name %>
   <%= doctor[i].hospital_id.location %>
   <button class="btn btn-success booking_btn" data-doctor-id="<%= doctor[i].doctor_id['id'] %>" id="<%= i %>">Book</button>
   <br><br><br>
  </div>
   <% } %>  
<script>
 
 var buttons= document.getElementsByClassName("booking_btn");
 for(let i = 0; i <buttons.length; i++) {
   buttons[i].addEventListener("click", function() {
   var doctorId = buttons[i].dataset.doctorId
   var booking_form=` <form action="/booking" method="post" id="book-appointment-form">
    <div id="myCalendar" class="vanilla-calendar" data-doctor-id="${ doctorId }"></div>
    <div id="boxes"></div>
    <button type="submit" class="btn btn-success">Confirm</button>
    </form>`
    document.getElementById("details"+i).insertAdjacentHTML( 'beforeend', booking_form);
    createCalendar();
    sendSelectedDate(i);
   })
 }

 function createCalendar(){
  calendarSet=true;
 myCalendar = new VanillaCalendar({
 selector: "#myCalendar",
 pastDates: false,
 availableWeekDays: [
   {day: 'monday'},
   {day: 'tuesday'},
   {day: 'wednesday'},
   {day: 'thursday'},
   {day: 'friday'}
 ], 
 datesFilter: true
});

}
 function sendSelectedDate(i){
  let date_selected = document.getElementById("myCalendar");
  document.getElementsByClassName("vanilla-calendar-body")[0].addEventListener("click", function(e) {
  e.preventDefault();
  var t=date_selected.dataset.doctorId
  var d =new Date(date_selected.value).toLocaleDateString('ko-KR').slice(0, -1).replaceAll('. ','-');
  axios.post('/time_slots', {app_date: d,doctor: t}).then(function (response) {
    var $section = $('<div class="col-md-4"></div>');
  (JSON.parse(response.data.slots)).forEach(function(slot) {
    $section.append(`<button>${slot.time_slot}</button>`);
  });
  $('#boxes').html($section);
    }).catch(function(e) {
    console.log(e);
    console.log("Please try again later.");
  })
})
 }
</script>

【讨论】:

    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 2017-08-20
    • 2019-12-08
    • 1970-01-01
    • 2011-10-29
    • 2013-10-20
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多