у меня есть список проектов, каждый из которых имеет один тег:
проект 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 спасибо :) я редактирую свой пост, чтобы добавить свой контроллер, где я отображаю свою страницу, есть идеи, потому что я немного потерялся для рендеринга?
Когда вы говорите «контроллер», что вы имеете в виду? Это экспресс контроллер?
Да, я визуализирую свой файл js на своем сервере
И да, это экспресс-контроллер @Cue



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Этот код 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), он говорит, что проект не определен, возможно, это строка
правильно ли ваши данные поступили в ejs?
проверьте с помощью console.info
В консоли у меня есть изменения, но я хочу показать только проекты с выбранными тегами
возможно, вы не правильно установили id='Appartements' или id='here'
Это работает @tuhin47, но я вижу только один проект .. есть идеи?
Журнал консоли показывает около 10 проектов, но файл . foreach просто запустить один раз
Да, я понимаю проблему. Я отредактировал свой код. Теперь это работает. Пожалуйста, попробуй.
отлично! Большое спасибо! у меня есть последний вопрос о содержании: я отредактировал свой пост, чтобы добавить содержимое, которое хочу показать, могу ли я отобразить это в своем скрипте или мне нужно сделать это в javascript ..? потому что на данный момент у меня есть только заголовки, включенные в сценарий, и я не вижу весь свой контент в div с идентификатором «здесь»
в этом процессе вы можете создать элемент, как я создаю h2 в javascript. Кстати, если ответ правильный, не забудьте отметить его правильным :)
Итак, я должен сделать все с appendchild и создать элемент в js? @tuhin47
хорошо, я имею в виду, что я попробую, но, как и мой код в моем вопросе, у меня есть некоторые onmouseover = "onProjectHover" и т. д...
Вам необходимо повторно отобразить шаблон, если вы изменили состояние данных, переданных ему изначально.