Динамическая переменная и содержимое ejs

у меня есть список проектов, каждый из которых имеет один тег:

проект 1 : тег : дом

проект 2 : тэг : квартира

...

И я хочу иметь возможность отображать только проекты, которые включают один выбранный тег

Если я поставлю тег, он работает:

<% if (project.tags.includes('Appartements')) { %>
    <h2 class = "project-title"><%= project.title %></h2>
<%}%>

Но я хочу использовать кнопку, чтобы изменить этот тег:

<button onclick = "changeSelectedTag('Appartements')">Appartements </button>
<button onclick = "changeSelectedTag('Maisons')">Maisons </button>


<script type = "text/javascript">
    changeSelectedTag = function(tag) {
        selectedTag = tag;
        console.info(selectedTag)
    }
</script>

Журнал консоли работает, я вижу, что selectedTag обновляется каждый раз, когда я нажимаю кнопку. но я поставил этот код, у меня 0 проектов и selectedTag пуст:

<% if (project.tags.includes(selectedTag)) { %>

Полный код:

<div class = "body-content">
    <div class = "body-tags">
        <%selectedTag = 'Appartements'%> 
        <button onclick = "changeSelectedTag('Appartements')">Appartements</button>
        <button onclick = "changeSelectedTag('Maisons')">Maisons</button>
    </div>
    <div class = "projects-container">
        <% projects.forEach((project) => { %>

        <% if (project.tags.includes(selectedTag)) { %>
            <div class = "projects-content">
                <h2 class = "project-title"><%= project.title %></h2>
            </div>
            <%}%>
        <% }); %>
    </div>
</div>

<script type = "text/javascript">
    changeSelectedTag = function(tag) {
        selectedTag = tag;
        console.info(selectedTag)
    }
</script>

RENDER в моем контроллере

exports.list = (req, res) => Project.find((err, projects) => {
  if (err) return next(err);
  let selectedTag;
  return res.render('../templates/projects.ejs', { projects: projects, selectedTag: selectedTag });
});

СОДЕРЖАНИЕ, которое я хочу отобразить:

<div id = "here" class = "items-container">
                <% projects.forEach((project) => { %>
                <%selectedTag = 'Appartements'%>
                <% if (project.tags.includes(selectedTag)) { %>
                    <div class = "items-content">
                        <img onmouseover = "onProjectHover('<%=project.id%>-img', '<%=project.id%>-titles')"  class = "item-img" src = "/<%=project.images.main.url%>" alt = "<%=project.images.main.alt%>">
                        <div onmouseleave = "onProjectLeave('<%=project.id%>-img', '<%=project.id%>-titles')" id = "<%=project.id%>-img" class = "item-hover-content">
                            <div class = "item-hover-content-title">Surface : <span class = "item-hover-content-value"><%=project.surface%> m2</span></div>
                            <div class = "item-hover-content-title">Budget : <span class = "item-hover-content-value"><%=project.budgect%></span></div>
                            <div class = "item-hover-content-title">Durée : <span class = "item-hover-content-value"><%=project.duration%> mois</span></div>
                            <button class = "item-hover-content-btn"><a href = "<%=project.slug%>">Voir le projet <i class = "fas fa-arrow-right"></i></a></button>
                        </div>
                        <div id = "<%=project.id%>-titles" class = "item-titles">
                            <h2 class = "item-title"><%= project.title %></h2>
                            <p class = "item-city"><%= project.cities %></p>
                        </div>

                    </div>
                    <%}%>
                <% }); %>
            </div>

Вам необходимо повторно отобразить шаблон, если вы изменили состояние данных, переданных ему изначально.

Cue 27.07.2019 03:07

@Cue спасибо :) я редактирую свой пост, чтобы добавить свой контроллер, где я отображаю свою страницу, есть идеи, потому что я немного потерялся для рендеринга?

Benjamin Barbé 27.07.2019 03:11

Когда вы говорите «контроллер», что вы имеете в виду? Это экспресс контроллер?

Cue 27.07.2019 03:49

Да, я визуализирую свой файл js на своем сервере

Benjamin Barbé 27.07.2019 12:15

И да, это экспресс-контроллер @Cue

Benjamin Barbé 27.07.2019 14:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
4 008
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот код ejs работает. Я использую чистый javascript. Вы также можете использовать jQuery.

<div class = "body-content">
  <div class = "body-tags">
    <button id='Appartements' onclick = "changeSelectedTag('Appartements',<%=JSON.stringify(projects)%>)">Appartements</button>
    <button onclick = "changeSelectedTag('Maisons',<%=JSON.stringify(projects)%>)">Maisons</button>

  </div>
  <div id='here' class = "projects-container"></div>
</div>
<script type = "text/javascript">
  changeSelectedTag = function(tag, projects) {
    selectedTag = tag;
    console.info(selectedTag);
    var main = document.getElementById('here');
    main.innerHTML = '';
    console.info(projects);
    projects.forEach(el => {
      if (el.tags.includes(selectedTag)) {
        var div = document.createElement('div');
        div.className = 'projects-content';
        var h2 = document.createElement('h2');
        h2.className = 'project-title';
        h2.innerHTML = el.title;
        div.appendChild(h2);
        main.appendChild(div);
      }

    });

  }
  document.getElementById('Appartements').click();
  //changeSelectedTag('Appartements',<%=JSON.stringify(projects)%>);
</script>

привет @tuhin47, я получил эту ошибку: список: 307 Uncaught TypeError: Невозможно установить свойство 'innerHTML' равным нулю в changeSelectedTag (список: 307) в HTMLButtonElement.onclick (список: 53), он говорит, что проект не определен, возможно, это строка

Benjamin Barbé 29.07.2019 19:42

правильно ли ваши данные поступили в ejs?

tuhin47 29.07.2019 19:53

проверьте с помощью console.info

tuhin47 29.07.2019 19:58

В консоли у меня есть изменения, но я хочу показать только проекты с выбранными тегами

Benjamin Barbé 29.07.2019 19:59

возможно, вы не правильно установили id='Appartements' или id='here'

tuhin47 29.07.2019 20:05

Это работает @tuhin47, но я вижу только один проект .. есть идеи?

Benjamin Barbé 29.07.2019 23:14

Журнал консоли показывает около 10 проектов, но файл . foreach просто запустить один раз

Benjamin Barbé 29.07.2019 23:18

Да, я понимаю проблему. Я отредактировал свой код. Теперь это работает. Пожалуйста, попробуй.

tuhin47 30.07.2019 05:25

отлично! Большое спасибо! у меня есть последний вопрос о содержании: я отредактировал свой пост, чтобы добавить содержимое, которое хочу показать, могу ли я отобразить это в своем скрипте или мне нужно сделать это в javascript ..? потому что на данный момент у меня есть только заголовки, включенные в сценарий, и я не вижу весь свой контент в div с идентификатором «здесь»

Benjamin Barbé 30.07.2019 13:34

в этом процессе вы можете создать элемент, как я создаю h2 в javascript. Кстати, если ответ правильный, не забудьте отметить его правильным :)

tuhin47 30.07.2019 13:41

Итак, я должен сделать все с appendchild и создать элемент в js? @tuhin47

Benjamin Barbé 30.07.2019 13:46

хорошо, я имею в виду, что я попробую, но, как и мой код в моем вопросе, у меня есть некоторые onmouseover = "onProjectHover" и т. д...

Benjamin Barbé 30.07.2019 13:49

Другие вопросы по теме