【问题标题】:Using a nodejs server and Pug how can I display elements from a list one at a time and iterate using a button?使用 nodejs 服务器和 Pug 如何一次显示列表中的元素并使用按钮进行迭代?
【发布时间】:2019-12-27 18:15:19
【问题描述】:

我对 Web 开发和 NodeJs 服务器非常陌生,而 Pug 这是我第一次使用这些。本质上,我想要一个盒子,它是一个 div,我现在想根据 JSON 文件中的列表动态更改该盒子中的数据,最终当我得到这个工作时,我将使用数据库来提供该列表.我已经设置了我的服务器并使用一些在线教程设置了我的 Pug 代码的基本部分。我知道我必须使用一些 javascript 来完成这项工作,但我什至无法在我的哈巴狗代码的“脚本”部分访问我的列表,这让我更加困惑。这是我到目前为止的代码:

server.js:

const express = require('express');
const app = express();
const testTweets = require('./testTweets.json');
app.set('view engine', 'pug');
app.use(express.static(__dirname + '/public'));


app.get('/', (req, res) => {
  res.render('index', {
    title: 'Tweet Labeler',
    data: testTweets.tweets
  });
});

const server = app.listen(9000,() => {
   console.log(`Express running → PORT ${server.address().port}`);
});

index.pug:

doctype html
html
  head
    title #{title}
    link(rel='stylesheet', href='/css/style.css')
    meta(name="viewport" content="width=device-width, initial-scale=1")
  body
    main
      block header
        header.header
          h1 #{title}
      block content
      div.container
          h2#label Tweet ID:
          div.tweetBox
          button.button-next Next
          script.
            var maxLength = data.length
            console.log("In the script tag!" + maxLength)

注意*脚本部分根本不起作用,它给我一个错误,说“数据”未定义

testTweets.json:

{
  "tweets": [
    {
      "id":"0",
      "text": "this is tweet index 0",
      "relevancy": "unknown"
    },
    {
      "id":"1",
      "text": "this is tweet index 1",
      "relevancy": "unknown"
    },
    {
      "id":"2",
      "text": "this is tweet index 2",
      "relevancy": "unknown"
    },
    {
      "id":"3",
      "text": "this is tweet index 3",
      "relevancy": "unknown"
    },
    {
      "id":"4",
      "text": "this is tweet index 4",
      "relevancy": "unknown"
    }
  ]
}

非常基本的 json 文件,看看我是否可以让它工作。

这是页面的样子: 理想情况下,白框会像列表中每个元素的文本一样被填充,然后当他们单击下一步时,它将显示下一个元素的文本。

我浏览过 stackoverflow 和其他论坛,但我似乎无法使用 PUG 找到与此类似的内容,并且我查看了其他语言的方法,但我真的很挣扎,因为我什至无法访问列表我正在传入调用的数据,因为我的控制台只是出错并说“数据未定义”,但如果我在 Pug 中定期使用它(不在脚本中)部分,它肯定是定义的。提前感谢任何花时间帮助解决此问题的人,非常感谢!

【问题讨论】:

  • 数据变量仅在服务器上可用。我能想到的最简单的方法是为服务器上的每条推文渲染 h2 和 div.tweetbox 并添加一个类,例如hidden 将隐藏除第一个 h2 和 div 之外的所有元素。然后使用按钮可以添加/删除hidden 类来显示/隐藏元素。另一种方法是在服务器上将 h2 和 div 呈现为空,一旦在客户端加载页面,使用 ajax 从服务器获取数据,然后将 h2 和 div 的文本替换为来自 tweets 对象的文本。

标签: javascript html node.js express pug


【解决方案1】:

脚本标签中的data 变量是客户端javascript 变量,因此不会被定义,因为它独立于服务器端data 变量。您可以使用 pug 的 interpolation 功能将 data 的服务器端值放在 pug javascript 块中。

div.container
  h2#label Tweet ID:
  div.tweetBox
    each tweet in data
      p=tweet.text
  button.button-next Next
  script.
    var data = !{JSON.stringify(data)};
    var maxLength = data.length;
    console.log("In the script tag!" + maxLength);

data 将在服务器端渲染期间替换为服务器端数据变量中的 JSON 值。您可以使用 pug 的 each 迭代器来迭代数据来显示推文,也可以使用客户端 javascript 来执行此操作。

【讨论】:

  • 谢谢 不知道这个!我将尝试摆弄 javascript 以使其正常工作!我认为如果我使用客户端 javascript 进行翻译,那么当我使用我的数据库数据进行翻译时会更容易,因为我最终需要将一些数据发布回我认为在 javascript 中更容易的数据库?但不完全确定我现在将如何处理。你也知道我是否可以将 jQuery 与 pug 一起使用,还是应该坚持使用 vanilla javascript?
  • 同样在 javascript 函数中,例如,您将如何更改文本中的文本让我们说一个带有 iD 名称的标题标签让我们说“标签”。我一直在尝试使用 getElementbyID 方法,但它不起作用
  • 你可以使用 jQuery,vanilla JS 会更好。如果您有许多 DOM 操作或您的应用程序变得更大,我会推荐 reactvue.js。使用 getElementById 更改文本可以使用 document.getElementById("label").innerHTML="something"
  • 非常感谢您的工作!你怎么知道使用“interHTML”而不是 .text 或 .value,这是我在浏览答案时看到的。后来当我将东西发送回数据库时,是在客户端javascript中完成还是通过某种发布请求通过服务器完成?您是否知道任何简单的指南或任何可能有帮助的相关信息。再次感谢大家的帮助!
  • 那可能是 jQuery 您正在查看 .text 和 .value 。您需要一个 POST 请求,以及一些客户端 ajax 调用。恐怕我不知道有什么特别的指南,但谷歌是你的朋友。如果您遇到问题,可以发布问题....
猜你喜欢
  • 2020-12-05
  • 2016-12-11
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2019-03-08
相关资源
最近更新 更多