web-dev-qa-db-fra.com

exécution de la fonction javascript dans le modèle jade

Je suis nouveau sur nodejs et j'essaye de créer un fichier jade pour le contenu html myfile.jade: Voici le contenu du fichier:

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

Cependant, lors de son exécution, il génère l'erreur suivante:

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 ;

Si je supprime console.log, il renvoie l'erreur en disant:

TypeError: mweb/views/collections.jade:18
  > 18|             a(href="/collection/#{item.name}") #{capitalize(itemName)}

Pour autant que je sache, la majuscule est appelée pendant la compilation de jade et la fonction n'est pas disponible car la balise de script est également compilée dans le html. Quelle est la meilleure façon pour moi de faire évaluer cet appel a) côté serveur ou b) côté client?

THX

16
Kiran

Vous devez définir la fonction dans le cadre de jade, pas dans JS vous générez:

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

mais il est probablement préférable de l'avoir en dehors du modèle et de transmettre la référence aux objets d'aide

20
Andrey Sidorov

Je me rends compte que c'est vraiment vieux, mais quand vous déclarez une fonction en jade, vous devez faire

script.

ne pas

script

la période fait la différence et permettra à jade de comprendre qu'il s'agit en fait d'un morceau de code plutôt que de HTML.

8
user1241388

Par cette #{capitalize(itemName)}, vous essayez d'appeler une fonction transmise au modèle depuis le contrôleur (back-end).

Par exemple (/ routes/index.js):

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

En index.jade

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

lang

est une fonction définie précédemment qui prend un certain paramètre.

4
gregiolo