Экспресс.JS HBS module-частичные регистры из.файл hbs
я использую руль.js ОБД фантик на экспресс.js. У меня шаблоны работают нормально, но мне нужно добавить частичные файлы для отображения с моими представлениями.
Я хотел бы сделать что-то вроде этого:
hbs.registerPartial('headPartial', 'header');
// where "header" is an .hbs file in my views folder
однако он бросает "заголовок частичный не может быть найден".
я могу сделать registerPartial работу, если я передаю строку html на второй param, но я хотел бы использовать отдельные файлы представления для моих частичных.
Я не нашел никакой документации по этому поводу, но надеюсь, что я могу просто пропустить что-то легкое.
кто-нибудь знает, как использовать файлы просмотра в методе registerPartial? Если да, то как это реализовать?
обновление
чтобы дать больше контекста, позвольте мне добавить больше кода. Вот мой" серверный " файл-приложение.js
var express = require('express')
, routes = require('./routes')
, hbs = require('hbs');
var app = module.exports = express.createServer();
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'hbs');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use(express.errorHandler());
});
// this is the line that generates the error
hbs.registerPartial('headPartial', 'header');
// What I'm expecting is for "headPartial" to be a compiled template partial
// of the template within views/header.hbs, but it is not loading this way.
// If I do something like hbs.registerPartial('headPartial', '<p>test</p>');
// then it does work. I need to know how to pass an .hbs file to the
// registerPartial method.
// Routes
app.get('/', routes.index);
app.listen(3000);
и вот мои маршруты.индексный файл:
exports.index = function(req, res){
res.render('index', { title: 'Express' })
};
в моей папке views у меня есть три шаблоны:
views/
header.hbs (this is my partial)
index.hbs
layout.hbs
в моем индексе.файл hbs, я вызываю "headPartial" частичный с:
{{> headPartial}}
любая помощь очень ценится.
5 ответов
этой код загружает все частичные шаблоны в каталоге и делает их доступными по имени файла:
var hbs = require('hbs');
var fs = require('fs');
var partialsDir = __dirname + '/../views/partials';
var filenames = fs.readdirSync(partialsDir);
filenames.forEach(function (filename) {
var matches = /^([^.]+).hbs$/.exec(filename);
if (!matches) {
return;
}
var name = matches[1];
var template = fs.readFileSync(partialsDir + '/' + filename, 'utf8');
hbs.registerPartial(name, template);
});
для удобства registerPartials предоставляет быстрый способ загрузки всех частичных файлов из определенного каталога:
var hbs = require('hbs');
hbs.registerPartials(__dirname + '/views/partials');
частичные файлы, загружаемые из каталога, называются на основе их имени файла, где пробелы и дефисы заменяются символом подчеркивания:
template.html -> {{> template}}
template 2.html -> {{> template_2}}
login view.hbs -> {{> login_view}}
template-file.html -> {{> template_file}}
Ура!
похоже, что создание переменной и вытягивание кода шаблона вручную работает:
var hbs = require('hbs')
, fs = require('fs')
, headerTemplate = fs.readFileSync(__dirname + '/views/_header.hbs', 'utf8');
и затем:
hbs.registerPartial('headPartial', headerTemplate);
для меня у меня был файл шаблона my-partial.hbs
затем я попытался получить к ним доступ через:
{{> my-partial }}
но частичный был сохранен в hbs как my_partial независимо от имени файла.
это благодаря HBS версии 3.1.0 line 218
.slice(0, -(ext.length)).replace(/[ -]/g, '_').replace('\', '/');
Это readme
для меня у меня есть такая функция, как:
var hbs = require('hbs');
var fs = require('fs');
var statupfunc = {
registerHbsPartials : function(){
//this is run when app start
hbs.registerPartials(__dirname + "/" + resource.src.views + '/partials');
},
registerOneHbsPartials : function(event){
//this is run for gulp watch
if(event.type == 'deleted')
{
return;
}
var filename = event.path;
var matches = /^.*\(.+?)\.hbs$/.exec(filename);
if (!matches) {
return;
}
var name = matches[1];
var template = fs.readFileSync(filename, 'utf8');
hbs.registerPartial(name, template);
}
};
Run statupfunc.registerHbsPartials при запуске приложения, а затем зарегистрировать gulp watch с statupfunc.registerOneHbsPartials зарегистрировать частичные файлы при новом создании
gulp.task('watch', function() {
gulp.watch(resource.src.views + '/partials/*.*', statupfunc.registerOneHbsPartials);
});