You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据用户下拉选项在EJS模板中展示MongoDB条件数据

解决方案:根据下拉选择动态展示MongoDB文档

核心思路

通过后端提供按年级筛选的API接口,前端监听下拉框变化时调用该接口获取对应模块数据,再动态渲染到页面。以下是具体实现步骤:


1. 后端新增按年级查询模块的API

修改注册控制器,新增接口用于接收年级参数,从MongoDB中筛选对应年级的模块:

const db = require('../data/database');

async function getRegistration(req, res) {
  const modules = await db.getDb().collection('modules').find().toArray();
  res.render('student/registration/registration', { modules: modules });
};

// 新增:根据年级获取对应模块的接口
async function getModulesByYear(req, res) {
  const year = req.query.year;
  // 假设modules集合中存储年级的字段名为`year`,值与下拉框的value(0-3)对应
  const filteredModules = await db.getDb().collection('modules')
    .find({ year: parseInt(year) }) // 转数字匹配数据库字段类型
    .toArray();
  res.json(filteredModules); // 返回JSON格式数据
};

module.exports = {
  getRegistration: getRegistration,
  getModulesByYear: getModulesByYear
}

别忘了在路由文件中配置该接口:

const registrationController = require('./controllers/registration.controller');
// 配置API路由
app.get('/modules/by-year', registrationController.getModulesByYear);

2. 修复EJS模板的结构问题

原模板中循环重复创建ul#module-list会导致ID重复,JS无法正确操作。将ul标签移到循环外部:

<label for="year">Select year</label>
<select name="year" id="year">
  <option value="0">Year 1</option>
  <option value="1">Year 2</option>
  <option value="2">Year 3</option>
  <option value="3">Year 4</option>
</select>

<div class="modules">
  <!-- 将ul放在循环外,确保页面只有一个module-list -->
  <ul id="module-list">
    <% for (const module of modules) {%>
      <li>
        <input type="checkbox" name="module" id="<%= module._id %>" value="<%= module._id%>"/>
        <label for="<%= module._id%>"><%= module.moduleCode%></label>
      </li>
    <% } %>
  </ul>
</div>

3. 修改前端脚本,动态获取并渲染数据

把硬编码的内容替换为调用后端API,获取真实模块数据后渲染:

const yearSelectorElement = document.getElementById('year');
const moduleListElement = document.getElementById('module-list');

async function updateModules() {
  const selectedYear = yearSelectorElement.value;
  try {
    // 调用后端API,传递选中的年级参数
    const response = await fetch(`/modules/by-year?year=${selectedYear}`);
    const modules = await response.json();
    
    // 清空现有列表
    moduleListElement.innerHTML = '';
    
    // 遍历数据生成列表项
    modules.forEach(module => {
      const li = document.createElement('li');
      li.innerHTML = `
        <input type="checkbox" name="module" id="${module._id}" value="${module._id}"/>
        <label for="${module._id}">${module.moduleCode}</label>
      `;
      moduleListElement.appendChild(li);
    });
  } catch (error) {
    console.error('加载模块失败:', error);
    moduleListElement.innerHTML = '<li>加载模块出错,请稍后重试</li>';
  }
}

// 可选:页面加载时默认渲染初始数据
// updateModules();

yearSelectorElement.addEventListener('change', updateModules);

内容的提问来源于stack exchange,提问作者Alpha-Sanz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:35:36