【问题标题】:How to retrieve data from server of a selected item in HTML如何从 HTML 中选定项目的服务器检索数据
【发布时间】:2018-11-11 15:58:54
【问题描述】:

我正在尝试创建一个网站,我需要检索所选项目预览的完整数据。

例如:亚马逊为您提供与您的搜索查询匹配的所有产品,然后您可以点击它们进入单个产品页面。 我也想做同样的事情。

到目前为止,我已经将我的搜索和动态加载项写入我的页面:

1) 我有一个 node.js 服务器,它使用包含元素列表(在我的例子中是医生)的 JSON 文件响应 get 请求

app.get('/doctors', function(req,res){
  var config = require('./doctor.json');
  config.forEach(function(dottore) {
    var tableName = dottore.name;
    console.log(tableName);
    });
  res.send(JSON.stringify(config));
})

2) 我从客户端 javascript 发出请求,如下所示:

$.get( '/doctors', function(data) {
$("<div class='row' id='dottori' ></div>").appendTo(".team");    
console.log(typeof data)

JSON.parse(data).map(addElement);    
 });

function addElement(doctor){
  console.log("Adding doctor");
  id=doctor.id;
  console.log(id);
  $("#dottori").append('<div class="col-md-4 ml-auto mr- 
              auto"><a href="./personaleGenerico.html" class="card card- 
        profile card-plain"><div class="btn btn-primary card-header card-header-image image-camminiamo"><img class="img" src="../assets/img/faces/4.jpg"></div><div class="card-body "><h3 class="card-title">'+doctor.name+'</h3><h4>Dott. in '+doctor.job+'</h4></div></a></div>');

}

而且效果很好。

我现在需要做的是点击我的医生的预览并加载页面personaleGenerico.html,其中应该包含有关该医生的完整信息。

我不知道如何将我服务器上的数据(这是一个包含所有医生的所有信息的 JSON)与我点击的元素相关联。

例如:如果我单击第一个名为“John”的医生,我将转到页面personaleGenerico.html,其中包含该特定医生的信息(这些信息都在我的 JSON 文件中可用)

【问题讨论】:

  • 我想我理解你的问题,但不是 100% 肯定。 “personaleGenerico.html”是您要根据点击的医生填充信息的通用页面吗?
  • 是的,没错!
  • 有很多方法可以做到这一点。可以说最简单的方法是向您的后端添加一条路线,让您可以通过 id 选择特定的医生。然后调用您的页面,例如personaleGenerico.html?id=1。使用该 id 参数,通过 ajax 将其传递给新的后端路由,并在您认为合适的时候使用该数据。解释如何在答案中完成所有这些操作将花费太多时间。如果你能缩小你的问题范围,这将有助于指导答案。
  • 对不起,如果我把问题留得太“开放”。我是这个领域的初学者,你能建议我如何改进我的问题以使其更清晰和更窄吗?我实际上不知道我具体需要什么来解决我的问题,这就是为什么我的问题有点“宽泛”。顺便说一下你的解决方案,我知道如何解决这个问题,谢谢!

标签: javascript jquery html node.js


【解决方案1】:

我认为主要有两种方式。

1 - 在服务器上渲染

您可以使用一些 html 生成器,例如 pug,并使用包含所有信息的完整 html 页面的服务器响应。

2 - 在客户端渲染

使用 AJAX 调用获取 json 信息,然后将数据放入 html 元素中。 有很多框架可以从数据中动态创建 html 元素:vuejsangular,... 但是,您也可以在 vanilla javascript 中使用数据创建 html 元素并将它们注入到 DOM 中。

从你所说的我认为你想要在服务器上进行渲染,如果你使用 expressjs,请参阅this example

编辑

根据评论回复进行编辑。

假设您的数据项具有标识符。 你必须像这样在服务器上创建一个路由:

app.get('/doctor/:id', function(req, res){
    const doctorId = req.params.id;
    const doctors = require('./doctor.json');
    // I assume doctors is an Array
    const doctor = doctors.find(item => {
        return item.id === doctorId;
    });
    // you can response directly in JSON not need stringify/parse
    res.json(doctor);
});

您还处理了医生不存在的情况。 然后就可以调用这个路由来获取数据了。

【讨论】:

  • 感谢您的回答,我知道如何将数据从服务器“推送”到我的 HTML 中。问题是我不知道如何告诉我的服务器我的客户想要加载哪个医生!为了更清楚:我知道如何用我需要的数据填充我的通用页面,但我不知道如何获取与我在上一页中选择的医生相关联的正确数据。我希望现在更清楚了
【解决方案2】:

您将需要另一个执行不同配置/数据库查询的后端端点。为此,您需要通过 URL 参数从前端发送医生的 ID。见:How to get a URL parameter in Express?

即:

app.get('/doctors/:id', function(req, res){
  var config = require('./doctor.json');
  const selectedDoctor = config.filter(function(doctor) {
      var tableName = doctor.name;
      console.log(tableName);
      return doctor.name === req.params.id
    });
  res.send(JSON.stringify(selectedDoctor));
})

【讨论】:

  • 谢谢,这解决了很多问题。最后一个问题:我如何获得所选医生的身份证?我知道当我单击一个元素时如何获取它,但是将它添加到我的 HTML 中然后在我的
    中获取 id 的值是否正确?我还没有完全理解我应该在哪里“存储”第一个请求的 id
  • 会有前端状态和后端状态。所以在前端你会有一个 id 可以是 html 标签。因此,您需要在 config.js 文件中为每个元素添加 id: 'someid'。然后,当您获取所有医生时,您将使用他们的数据 AND 和 id 填充页面上的每个医生元素(可以存储在 html id 标签中),然后在该元素的 onclick 处理程序中确保您获得该 id并将其作为请求参数发送。抱歉耽搁了,出去吃午饭了。如果有帮助,请确保为他人投票并标记为已回答!
猜你喜欢
相关资源
最近更新 更多
热门标签