sails.js: переменные, видимые шаблонам ejs, только если они не проверяют их наличие
Я новичок во всей экосистеме nodejs, поэтому будьте любезны говорить медленно и использовать маленькие слова.
В прошлом при разработке сайта на PHP я обычно использовал header.php и footer.php. Заголовок include обычно содержит элемент заголовка HTML, поэтому для определения значений по умолчанию для заголовка и мета-тегов в header.php я обычно реализую логику следующим образом:
if (title is not defined) {
use some default title;
}
Это позволяет мне отследить случай, когда я не установил теги заголовка или мета-описания для отдельных страниц, и использую некоторые глобальные значения по умолчанию.
Я пытаюсь сделать то же самое сейчас в sails.js и получаю странные результаты. В некотором представлении (например, "test.ejs") у меня есть:
<%
var pg_title = 'test';
%>
<%- include header.ejs %>
а то в шапке у меня есть:
<%
console.log(pg_title);
%>
Это работает. (т.е. это повторяет "тест")
Однако, если header.ejs содержит какой-либо вид проверки того, был ли pg_title определен, то значение pg_title, которое было установлено в test.ejs, всегда игнорируется (оно отображает "undefined").
На данный момент header.ejs содержит следующий код, но я пробовал несколько разных вещей.
if (typeof pg_title == 'undefined') {
var pg_title = __('pg_title_default');
}
Вышеуказанное условие всегда оценивается как истинное. Если я удаляю "var" в header.ejs, как предлагает Рави ниже, я получаю ошибку "pg_title is notfined".
Что я делаю неправильно?
1 ответ
Вы не должны устанавливать переменные в таких шаблонах. Помимо явно усугубляющихся проблем с областью действия, это просто запутывает слои вашего приложения и дает вам еще одно место, где нужно проверять, когда что-то идет не так. Установите свой вид местных жителей в:
- ваш
res.view()
вызов, если отображается представление из действия контроллера, или res.locals
в политике или- с использованием
locals
ключ конфигурации, если привязка маршрута напрямую к представлению вconfig/routes.js
Если вам нужно установить некоторые значения по умолчанию для местных жителей, политика будет хорошим местом.
Итак, то, что вы пытаетесь сделать, это плохая практика. Что касается причины, почему это не работает, это второй var
это проблема, как в var pg_title = __('pg_title_default')
, Это вызывает некоторые из тех обостряющих проблем с областями видимости, которые я упоминал, когда ejs
пытается eval
этот блок кода.