Как использовать переданную переменную в файле ejs

ТАК я пытаюсь изменить значение тега html в файле ejs на переменную, которую я объявил в файле JavaScript

let checkbox = document.querySelector('input[name = "plan"]');

checkbox.addEventListener('change', function () {
    if (this.checked) {
        document.querySelector('.plan-title').innerHTML = investment.name;
        document.querySelector('.plan-description').innerHTML = investment.description;
    }
    else {
        document.querySelector('.plan-title').innerHTML = '';
        document.querySelector('.plan-description').innerHTML = '';
    }
});

Поэтому, когда я передаю его напрямую, он отображается, но я хочу, чтобы он был динамическим, и хотя он проходит, когда я щелкаю флажок, он, похоже, не имеет никакого значения.

<%- include('../partials/sidebar'); %>
    <% if (currentUser && currentUser.isAdmin){ %>
        <a href = "/investment/new">Add New Plan</a>
        <% } %>
            <div class = "container">
                <h1>Investments</h1>

                <% investments.forEach((investment)=>{ %>
                    <div class = "col-md-4">
                        <div class = "card">
                            <strong>
                                <%= investment.name %>
                            </strong>
                            <h4>
                                <%= investment.min %> - <%=investment.max %>
                            </h4>
                            <p>
                                <%= investment.caption %>
                            </p>
                            <p><input type = "checkbox" name = "plan" id = "">Choose investment</p>
                        </div>
                        <% if (currentUser && currentUser.isAdmin){ %>
                            <a href = "/investment/<%= investment._id %>/edit">Edit</a>
                            <a href = "/investment/new">Delete</a>
                            <% } %>

                    </div>

                    <% }) %>

                        <% investments.forEach((investment)=>{ %>
                            <div class = "">
                                <div><strong>Package: </strong>
                                    <p class = "plan-title">
                                    </p>
                                </div>
                                <p class = "plan-description">

                                </p>
                                <input type = "number" name = "" id = "" min = "<%= investment.min %>"
                                    max = "<%= investment.max %>">
                            </div>


                            <% }) %>


            </div>

            <%- include('../partials/footer'); %>

Я не могу пройти через это, нужна помощь, спасибо!

🤔 А знаете ли вы, что...
JavaScript обеспечивает обработку ошибок с использованием конструкции try...catch.


1 087
2

Ответы:

Мне непонятно, о какой переменной вы говорите, но любая переменная, которую вы установили в сценарии на стороне клиента, не будет доступна вам в файле EJS, который вы визуализируете на сервере. Серверный код Node.js и клиентский код JavaScript не знают друг друга.


Решено

Если я правильно понял, вы пытаетесь вставить значение переменной EJS в тег HTML из JavaScript, когда пользователь устанавливает флажок.

Значение тега HTML не меняется, потому что в вашем коде JS:

    document.querySelector('.plan-title').innerHTML = investment.name;
    document.querySelector('.plan-description').innerHTML = investment.description;

investment.name и investment.description не определены. Проверьте консоль на своей странице.

Это связано с тем, что вы пытались получить доступ к переменным EJS после завершения рендеринга страницы.

EJS в основном используется для передачи серверных переменных на страницу до ее отображения. Поэтому после рендеринга вы не можете получить доступ к этим переменным.

Итак, чтобы иметь значения этих переменных в вашем JavaScript после завершения рендеринга страницы, попробуйте сделать:

    document.querySelector('.plan-title').innerHTML = '<%- investment.name %>';
    document.querySelector('.plan-description').innerHTML = '<%- investment.description %>';

вместо. Вот как вы передаете переменную EJS в JavaScript. JavaScript теперь видит это как строку, и в этом нет проблем, в отличие от вашего кода, где он искал объект investment и возвращал значение undefined, поскольку эта переменная не определена на стороне клиента.

Кроме того, поскольку у вас есть цикл for-each в части HTML, я предполагаю, что вы пытаетесь изменить значения определенных элементов plan-title и plan-description. Если это так, '<%= investment.name %>' и '<%= investment.description %>' в части JavaScript также должны быть в цикле for-each, но это будет большой беспорядок.

Вместо этого я предлагаю вам прямо под циклом for-each в части HTML добавить класс в тег div в соответствии с индексом цикла for-each, добавить событие изменения в флажок и передать флажок и индекс цикл for-each для функции JavaScript, которая будет обрабатывать событие при изменении, включить переменные EJS в разделы plan-title и plan-description, а в функции JavaScript, которая обрабатывает событие изменения, изменить свойство отображения CSS с display: none на display: block для этих элементов div .

См. пример:

HTML:

            <% investments.forEach((investment, index)=>{ %>
                <div class = "col-md-4">
                    <div class = "card">
                        <strong>
                            <%= investment.name %>
                        </strong>
                        <h4>
                            <%= investment.min %> - <%=investment.max %>
                        </h4>
                        <p>
                            <%= investment.caption %>
                        </p>
                        <p><input onchange = "displayPlan(this, '<%= index %>')" type = "checkbox" name = "plan" id = "">Choose investment</p>
                    </div>
                    <% if (currentUser && currentUser.isAdmin){ %>
                        <a href = "/investment/<%= investment._id %>/edit">Edit</a>
                        <a href = "/investment/new">Delete</a>
                        <% } %>

                </div>
                <% }) %>
                    <% investments.forEach((investment, index)=>{ %>
                        <div class = "plan <%= index %>" style = "display: none;">
                            <div><strong>Package: </strong>
                                <p class = "plan-title">
                                 <%- investment.name  %>
                                </p>
                            </div>
                            <p class = "plan-description">
                              <%- investment.description %>
                            </p>
                            <input type = "number" name = "" id = "" min = "<%= investment.min %>"
                                max = "<%= investment.max %>">
                        </div>
                        <% }) %>

JavaScript:

    function displayPlan(checkbox, id){
        if (checkbox.checked) {
            document.querySelector(`.plan.${id}`).style.display = 'block';
        }
        else {
            document.querySelector(`.plan.${id}`).style.display = 'none';
        }
    }

Ваше здоровье!

Обновлено: проблемы с грамматикой и синтаксисом