Переплетение переменных EJS и Javascript внутри
Мне нужно использовать переменную Javascript (определенную в интерфейсе) в некотором коде EJS следующим образом:
var selected = 1;
<% for (var i=0; i < supplies.length; i++) { %>
if (i == selected) {
console.log(supplies);
}
<% } %>
Я использую EJS, Express.js и сокет.Ио. Я мог бы преобразовать переменную Javascript в переменную EJS, отправив сообщение на мой узел.экземпляр сервера js, но это глупо... Есть ли способ использовать переменные Javascript внутри EJS?
изменить: Я хочу получить доступ к поставкам, массив JavaScript, после того, как пользователь выбрал элемент из выпадающего меню. Когда он выбирает этот элемент, функция javascript с вышеуказанным кодом должна получить доступ к некоторым EJS. Вот почему мне нужно использовать обычную переменную Javascript в EJS.
1 ответов
могу ли я передать переменную JavaScript в шаблон?:
можно получить больше данных в шаблон и повторно отобразить его, но не так, как вы думаете, и не делая другого запроса на сервер (если это не для получения большего количества данных, а не для получения большего HTML).
устранение:
этот вопрос будет сложно ответить без более подробной информации, поэтому я собираюсь сделать некоторые предположения о почему вы хотите передать выбранное значение в шаблон EJS. Я сделаю все возможное, чтобы ответить на этот вопрос с ограниченной информацией о ваших целях.
похоже, что ваш пользователь выполняет какое-то действие на странице, например, выбор источника очистки, и вы хотите отобразить данные по-разному, на основе выбранного пользователем элемента. Для этого можно повторно отобразить шаблон и передать данные, определяющие выбранный элемент, с помощью помощника представления для применения определенного элемента класс для выбранного элемента:
вот модифицированная очистка.шаблон ejs с классом, добавленным с помощью помощника просмотра:
чистка.EJS по:
<script>
// NOTE: even if uncommented, JavaScript inside a template will not run.
// var selected = 1;
</script>
<h1><%= title %></h1>
<ul>
<% for(var i=0; i<supplies.length; i++) { %>
<li>
<!-- apply a class to the selected element -->
<a class='<%= supplies[i].selected %>' href='supplies/<%= supplies[i].value %>'>
<%= supplies[i].value %>
</a>
</li>
<% } %>
</ul>
визуализированный HTML выглядит следующим образом:
<script>
/** NOTE: Script blocks will not fire in rendered templates. They are ignored
// var selected = 1;
</script>
<h1>Cleaning Supplies</h1>
<ul>
<li>
<a class="" href="supplies/Broom">
Broom
</a>
</li>
<li>
<!-- Note the selected element -->
<a class="selected" href="supplies/mop">
mop
</a>
</li>
<li>
<a class="" href="supplies/Hammer">
Hammer
</a>
</li>
</ul>
это представление было отображено с использованием следующего кода JavaScript:
// modified data structure so that array of supplies contains objects
// with the name of the item and whether or not it's selected.
data = {
"title":"Cleaning Supplies",
"supplies":[
{
"value":"Broom",
"selected":""
},
{
"value":"mop",
"selected":"selected"
},
{
"value":"Hammer",
"selected":""
}
]
};
// pass data into template and render
var html = new EJS({url: 'cleaning.ejs'}).render(data);
// add HTML to the DOM using a <div id="container"></div> wrapper.
document.getElementById("container").innerHTML = html;
как вы можете видеть, поставки[i].selected применяет выбранный класс к элементу, помеченному как выбран в структуре данных. Я изменил значение href так, чтобы он получил доступ к объекту в элементе массива ith вместо значения самого массива.
теперь, когда выбранный элемент изменен, мы просто изменяем переменную данных, повторно визуализируем шаблон EJS и добавляем его в DOM.
С помощью этого CSS в голове вашего HTML-документа вы увидите что-то похожее на то, что отображается ниже:
<style>
.selected { color:red; }
</style>
почему JavaScript в шаблоне не работает:
метод, который вы пытаетесь использовать для управления значениями JavaScript или использовать значения JavaScript внутри шаблона EJS не будет работать. Это связано в основном с контекстом , когда выполняется JavaScript.
вы правы, думая, что шаблоны EJS компилируются на стороне клиента. Однако JavaScript в представлении помощники выполняются независимо от JavaScript в глобальном контексте. Глядя на EJS по.исходный код js, похоже, что eval используется в этом процессе.
кроме того, EJS возвращает отображаемый HTML в виде строки, и документация для EJS инструктирует нас вводить эту отображаемую строку шаблона в DOM с помощью innerHTML:
document.getElementById("container").innerHTML = html;
независимо от того, какую технологию просмотра вы используете, одна из основных истин некоторых браузеров, когда она приходит на JavaScript это:некоторые браузеры могут не оценить <script>
блоки, добавленные в DOM с помощью innerHTML.
другими словами, в моем тестовом шаблоне, когда я попытался добавить тег скрипта для вывода выбранного значения в консоль, я увидел, что блок скрипта был добавлен, но из-за того, как работает innerHTML, он не был выполнен:
пример шаблона демонстрирует, что JavaScript не будет работать при добавлении с помощью innerHTML будет:
<h1><%= title %></h1>
<ul>
<% for(var i=0; i<supplies.length; i++) { %>
<span id="selected"></span><script>console.info('test <%= i %> = <%= supplies[i] %>');</script>
<li>
<a href='supplies/<%= supplies[i] %>'>
<%= supplies[i] %>
</a>
</li>
<% } %>
</ul>
визуализированный HTML:
как вы можете видеть ниже, на консоли.операторы log присутствуют в HTML. Однако при добавлении с помощью innerHTML они не будут срабатывать.
подход к технологиям view заключается в том, чтобы ограничить их использование только этим, визуализируя представление. держите свою логику в"обычном JavaScript".
<h1>Cleaning Supplies</h1>
<ul>
<span id="selected"></span><script>console.info('test 0 = Brrom');</script>
<li>
<a href='supplies/Brrom'>
Brrom
</a>
</li>
<span id="selected"></span><script>console.info('test 1 = mop');</script>
<li>
<a href='supplies/mop'>
mop
</a>
</li>
<span id="selected"></span><script>console.info('test 2 = Hammer');</script>
<li>
<a href='supplies/Hammer'>
Hammer
</a>
</li>
</ul>
больше примеров и документации можно найти на шаблонах EJS на Код Google Встроенный JavaScript сайт.