Экспресс-рендеринг Dom-элементов узла

#javascript #node.js #express

#javascript #node.js #экспресс

Вопрос:

Я пытаюсь создать веб-сайт для поиска учетных записей League of Legends и пытаюсь научиться правильно отображать HTML. У меня есть большой объект, содержащий информацию для множества разных совпадений в нем. Я хочу создать элемент DOM для каждого совпадения в истории совпадений, а затем заполнить этот элемент информацией, содержащейся в объекте. Как я могу сделать это динамическим способом. Я не всегда буду знать, сколько совпадений будет в объекте.

  match0: {
    champion: 76,
    gameStartTime: 1600413655154,
    gameDuration: 1347,
    playerList: {
      Team_100_JUNGLE: [Object],
      Team_100_MIDDLE: [Object],
      Team_100_BOTTOM: [Object],
      Team_100_SUPPORT: [Object],
      Team_100_TOP: [Object],
      Team_200_MIDDLE: [Object],
      Team_200_JUNGLE: [Object],
      Team_200_BOTTOM: [Object],
      Team_200_SUPPORT: [Object],
      Team_200_TOP: [Object]
    },
    result: 'Loss',
    team_100_total_kills: 15,
    team_200_total_kills: 23
  },
  

Вот как выглядит каждое совпадение внутри массива истории совпадений. В массиве может быть 1 из этих объектов или 1000. Как я могу это сделать? Нужно ли мне полностью реструктурировать то, как я собираюсь это сделать? Отправить справку.

Ответ №1:

По моему мнению, ваш лучший выбор — использовать какой-то механизм создания шаблонов, вы можете предопределить структуру DOM (шаблон), а затем добавить в нее свой объект данных (в лучшем случае json), и он отобразит шаблон со всеми данными, предоставленными вашим объектом данных.

Handlebarsjs — мой выбор, но есть много альтернатив, надеюсь, это поможет, если вам нужна дополнительная помощь, дайте мне знать https://handlebarsjs.com /

РЕДАКТИРОВАТЬ: к сожалению, я не работал с EJS, но я пытаюсь объяснить это на примере руля. «matchhistory.hbs» — это ваш пример шаблона, который вы могли бы использовать для отображения всех ваших совпадений. Это происходит через #each он будет перебирать все ваши данные, которые вы ему предоставляете. На веб-сервере вам просто нужно отобразить его и отправить обратно пользователю, запрашивающему https://example.com/matchhisorty например.

Что касается вашей текущей проблемы, вам не нужно создавать DOM, rendner сделает это за вас.

Экспресс-веб-сервер (index.js ):

 
//This is only temporary, you need to call the lol api so you got the newest data
//Call the api in the router.get('/matchhistory')

let matchhistory = [
match0: {
    champion: 76,
    ...
    result: 'Loss',
    team_100_total_kills: 15,
    team_200_total_kills: 23
  },
  match1: {
    champion: 76,
    ...
    result: 'Loss',
    team_100_total_kills: 15,
    team_200_total_kills: 23
  },
]


router.get('/matchhistory', function(req, res, next) {
  let raw = matchhistory; //Here you can make your api call to get the matchhistory data
  let parsedata = JSON.parse(raw); //Parse it to json
  res.render('matchhistory', { title: 'Posts - Canime', pod_cards: home.pod.cards , naventry: home.nav.naventry}); //Send back the rendered Page
});
  

история совпадений..hbs

 <ul class="matchhistory-nav mr-auto">
    {{#each matchhistory}}
        <li class="nav-item" class="color-{{this.result}}">
            {{this.champion}}
        </li>
    {{/each}}
</ul>

  

Комментарии:

1. Я пытался использовать EJS, но меня смущает то, что он не позволяет мне запускать функцию, которая создает элементы DOM внутри шаблона, потому что она выполняется на стороне сервера, а DOM еще не существует. Поэтому я не знаю, как я смогу создать несколько элементов DOM в зависимости от количества совпадений.