Выполнение функции javascript внутри шаблона нефрита
Я новичок в nodejs и пытаюсь создать файл jade для содержимого html myfile.jade
:
Вот содержимое файла:
extends layout
block content
script
function capitalize(s) {
console.log("Testing js exec");
return s.charAt(0).toUpperCase() + s.slice(1);
};
table
- each item in list
tr
td
a(href="/collection/#{item.name}") #{capitalize(itemName)}
Однако при запуске он вызывает следующую ошибку:
Error: mweb/views/collections.jade:8
6| script
7| function capitalize(s) {
> 8| console.log("Testing js exec");
9| return s.charAt(0).toUpperCase() + s.slice(1);
10| };
unexpected text ;
Если я удалю console.log, он выдает сообщение об ошибке:
TypeError: mweb/views/collections.jade:18
> 18| a(href="/collection/#{item.name}") #{capitalize(itemName)}
Насколько я понял, capize вызывается во время компиляции jade, и функция недоступна, поскольку тег script также скомпилирован в html. Каков наилучший способ для меня оценить этот вызов
а) серверная сторона или
б) клиентская сторона?
спасибо
Ответы
Ответ 1
Вам нужно определить функцию в области jade, а не в JS, которую вы создаете:
block content
- function capitalize(s) { return s.charAt(0).toUpperCase() + s.slice(1); };
table
- var list = ['one', 'two']
- var itemName = 'test test'
- each item in list
tr
td
a(href="/collection") #{capitalize(itemName)}
но, вероятно, лучше иметь его вне шаблона и передать ссылку на объект-помощник
Ответ 2
Я понимаю, что это действительно старо, но когда вы объявляете функцию в нефрите, вам нужно сделать
script.
not
script
период делает разницу и позволит jade подобрать, что это на самом деле кусок кода, а не HTML.
Ответ 3
Под этим #{capitalize(itemName)}
вы пытаетесь вызвать функцию, которая передается шаблону с контроллера (back-end).
Например (/routes/index.js):
res.render('index', { title: 'Express test', fs : { echo : lang} });
В index.jade
a(href='/register') #{fs.echo('xxx')}
где
языки
- это функция, определенная ранее, которая принимает некоторый параметр.