2011-11-09 8 views
21

Używam pliku handlebars.js hbs wrapper w express.js. Mam szablony działające poprawnie, ale muszę dodać części, które mają być renderowane z moimi widokami.Moduł Express.js hbs - zarejestruj partials z pliku .hbs

chciałbym zrobić coś takiego:

hbs.registerPartial('headPartial', 'header'); 
// where "header" is an .hbs file in my views folder 

Jednak to rzucanie „header częściowe nie można znaleźć”.

Mogę zrobić registerPartial pracy, jeśli przekazuję ciąg html do drugiego param, ale chciałbym użyć osobnych plików widoku dla moich części.

Nie znalazłem żadnej dokumentacji na ten temat, ale mam nadzieję, że może mi brakować czegoś łatwego.

Czy ktoś wie, jak korzystać z plików widoku w metodzie registerPartial? Jeśli tak, w jaki sposób mogę to wdrożyć?

UPDATE

Aby dać więcej kontekstu, dodam więcej kodu. Oto mój "server" plik - app.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); 

I tu jest moje routes.index file:

exports.index = function(req, res){ 
    res.render('index', { title: 'Express' }) 
}; 

W moim folderze poglądów, mam trzy szablony:

views/ 
    header.hbs (this is my partial) 
    index.hbs 
    layout.hbs 

W pliku index.hbs nazywam części "headPartial" z:

{{> headPartial}} 

Każda pomoc jest bardzo doceniana.

Odpowiedz

36

tej code ładunku wszystkie cząstkowe szablony w katalogu i udostępnia je przez nazwa pliku:

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); 
}); 
+1

Nicei. Szybki sposób na udostępnienie wszystkich częściowych w razie potrzeby! – swatkins

+0

Dzięki Ben, to naprawdę bardzo pomogło. – Dave

11

Wygląda tworząc zmienną i ciągnąc w kodzie szablonu ręcznie działa:

var hbs = require('hbs') 
    , fs = require('fs') 
    , headerTemplate = fs.readFileSync(__dirname + '/views/_header.hbs', 'utf8'); 

i nowszych:

hbs.registerPartial('headPartial', headerTemplate); 
+0

Dzięki za to, działa świetnie – iancrowther

+0

wydaje się to dużo dodatkowej pracy, aby pozwać partials w express3 – chovy

35

Dla wygody zarejestruj się IALS zapewnia szybki sposób, aby załadować wszystkie partials z określonego katalogu:

var hbs = require('hbs'); 
hbs.registerPartials(__dirname + '/views/partials'); 

partials, które są ładowane z katalogu są imieniem na podstawie ich nazwy pliku, w którym przestrzenie i myślniki są zastąpione znakiem podkreślenia:

template.html  -> {{> template}} 
template 2.html -> {{> template_2}} 
login view.hbs  -> {{> login_view}} 
template-file.html -> {{> template_file}} 

Pozdrawiam!

+0

Witam, czy to działa również dla podkatalogów? W takim przypadku, w jaki sposób możemy uzyskać widoki? Dzięki –

+0

To świetnie, ale należy pamiętać, że ładuje częściowo asynchronicznie z wywołania zwrotnego - prawdopodobnie nie chcesz akceptować żądania, dopóki to się nie zakończy: [Pomocnicy i części] (https://github.com/pillarjs/hbs # helpers-and-partials) –

1

Dla mnie miałem plik szablonu my-partial.HBS

Następnie próbowałem do nich dostęp poprzez:

{{> my-partial }} 

Ale częściowy przechowywano w hbs jak my_partial niezależnie od nazwy pliku.

To dzięki hbs wersji 3.1.0 linii 218

.slice(0, -(ext.length)).replace(/[ -]/g, '_').replace('\\', '/'); 

Jest w readme

0

dla mnie, mam funkcji takich jak:

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 przy starcie aplikacji, a następnie zarejestrować zegarek gulp z statupfunc.registerOneHbsPartials zarejestrować partials na tworzenie nowych

gulp.task('watch', function() { 
    gulp.watch(resource.src.views + '/partials/*.*', statupfunc.registerOneHbsPartials); 
}); 
Powiązane problemy