#node.js #handlebars.js #templating
#node.js #handlebars.js #создание шаблонов
Вопрос:
У server.js
меня есть что-то вроде этого:
var express = require('express');
var path = require('path');
var exphbs = require('express-handlebars');
var app = new express();
var handlebars = require('./helpers.js')(exphbs);
app.set('views', path.join(__dirname, 'views'));
app.engine('.hbs', handlebars.engine);
app.set('view engine', '.hbs');
app.set ('port', (process.env.PORT || 5000));
app.get('/', function(req,res){
res.render('home', {
title: 'Express App with Handlebars templates',
content: 'This is some content',
persons: [
{
name: 'branchito',
instrument: 'guitar',
},
{
name: 'joe',
instrument: 'flute',
},
]
});
});
app.listen(app.get( 'port' ), function(){
console.log('Server started on port ' app.get('port'));
})
А затем в моем helpers.js
файле:
function hbsHelpers(hbs) {
return hbs.create({
helpers: { // This was missing
inc: function(value, options) {
console.log('reading it');
return parseInt(value) 1;
},
strong: function(text) {
return '<strong>' text '</strong>';
}
// More helpers...
}
});
}
module.exports = hbsHelpers;
Но затем вывод, сгенерированный strong
помощником, отображает это как <strong>...</strong>
… Как бы мне сделать, чтобы эта строка не была экранирована, я знаю, что есть Handlebars.SafeString()
, но не знаю, как использовать ее из этого экземпляра express-handlebars..
Ответ №1:
Для вывода необработанного HTML вместо экранированного HTML используйте три фигурные скобки вместо двух.
Например:
{{{strong}}}
Будет выводить необработанный HTML из помощника:
strong: function(text) {
return '<strong>' text '</strong>';
}
Ответ №2:
Не уверен, правильно ли я это понимаю, и, вероятно, немного слишком поздно, но у меня была такая же (или, по крайней мере, похожая проблема):
Когда я хотел показать свой контент с помощью {{ var }}, а var был, например
<strong>somevar</strong>
У меня была проблема в том, что он отображался как
amp;<strongamp;>somevaramp;</strongamp;>
Мой обходной путь заключался в том, что переменная не отображалась через средство визуализации Handlebars по умолчанию, а создавала функцию, делающую это за вас:
var hbs = exphbs.create({
/* ... */
helpers: {
raw: function (a) { return a; },
}
});
И в моем файле .handlebars я сделал следующее:
<p>{{#raw var}}{{/raw}}</p>
Итак, это в основном то же самое, что и вы. Я тоже попробовал ваш код, и у меня это сработало. Вероятно, вы не вызываете его прямо в файле handlebars?