2014-01-06 5 views
13

Я новичок в nodejs и пытается создать файл нефритовый для содержания HTML myfile.jade: Вот содержимое файла:Javascript выполнение функции внутри шаблона нефрита

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)} 

Насколько я понял, в jade-компиляции вызывается capizeize, и функция недоступна, так как тег скрипта также скомпилирован в html. Каков наилучший способ для этого вызова оценить на a) на стороне сервера или б) на стороне клиента?

Thx

ответ

17

Вы должны определить функцию в рамках нефрита, а не в 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)} 

, но это, вероятно, лучше иметь его вне шаблона и передать ссылку на хелперов объект

+0

спасибо. это работает. Не возражаете ли вы дать какие-либо рекомендации о том, как использовать помощников? – Kiran

+0

Я тоже интересуюсь этими вспомогательными объектами. – caiuspb

+0

Нет специальной библиотеки-помощников. Я имею в виду пользовательские функции как «помощники». Когда вы создаете шаблон, вы передаете свои объекты в качестве ввода, и вместе с данными вы можете передать ссылку на свои вспомогательные/полезные функции. –

7

Я понимаю, что это на самом деле старый, но при объявлении функции в нефрите, что вам нужно сделать

script. 

не

script 

период делает разницу и позволит нефрит подобрать то, что это на самом деле кусок кода, а не HTML.

4

К этому #{capitalize(itemName)} вы пытаетесь вызвать функцию, которая передается шаблону с контроллера (back-end).

Например (/routes/index.js):

res.render('index', { title: 'Express test', fs : { echo : lang} }); 

В то время как в index.jade

a(href='/register') #{fs.echo('xxx')} 

где

lang

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

Смежные вопросы