2016-08-02 39 views
3

Dies ist meine Ansichten Ordnerstruktur:Wie werden das Hauptlayout und die Teiltöne mit Koa-Views + Lenker gerendert?

- views 
    - layouts 
     layout.hbs 
    - partials 
     part.hbs 
    home.hbs 

Ich bin Rendering die Vorlage Breite:

app.use(views(__dirname + '/views', { 
    extension: 'hbs', 
    map: { hbs: 'handlebars' } 
})); 

router.get('/', async (ctx) => { 
    await ctx.render('home', { 
    Name: 'Iris', 
    Type: 'Web', 
    Path: '/' 
    }); 
}); 

Was ich will, ist die Haupt-Layout-Datei und die partials Ordner zu definieren, so wie es, wenn war in express-handlebars. Wirklich gibt es keine Möglichkeit, dies mit koa-views und reinem handlebars zu erreichen?

Ich muss koa-hbs oder koa-handlebars verwenden? Aber sie mit bald veraltete Funktionen (und Lenker v2.0.0, v3.0.0):

koa deprecated Support for generators will been removed in v3. 
See the documentation for examples of how to convert old middleware 
https://github.com/koajs/koa/tree/v2.x#old-signature-middleware-v1x app.js:45:5 

EDIT:

Scheint, wie koa-hbs und koa-handlebars Plugins nicht kompatibel mit koa v2. Es gibt also keine Möglichkeit koa v2, partials und layouts mit handlebars im Moment gerendert zu verwenden? :(Ohne diese (definieren layouts, partials) handlebars nutzlos sind also stucked noch mit express ...

Antwort

3

koa-hbs ist wirklich nur Lenker mit .registerPartial unter der Haube

so einfach wie möglich:..

var handlebars = require('handlebars'), 
    fs = require('fs') 

handlebars.registerPartial(
    'defaultLayout', 
    fs.readFileSync(__dirname + '/views/layouts/default.html', 'utf8') 
) 

// then continue with loading the application... 

Aber Sie wollen wahrscheinlich die Bequemlichkeit die es nur wenn Ihr gesamten partials Ordner beim Start geladen werden.

  1. Erstellen Sie eine Zusage, und führen Sie eine Funktion aus, die Ihren Teilkonvertierungsordner durchsucht, und registrieren Sie jeden Teil über handlebars.registerPartial. Es sollte das Versprechen lösen, wenn sie alle registriert sind.
  2. eine Middleware-Asynchron erstellen, die für das Versprechen gelöst werden wartet, so dass Ihre App alle Ansichten nicht dargestellt wird, bevor diese partials

Hier ist ein Beispiel registriert sind, die ich benutze:

var fs = require('fs'), 
    handlebars = require('handlebars'), 
    glob = require('glob'), // for convenience, npm install glob 
    path = require('path') 

function readAsPromise (path) { 
    return new Promise(function (resolve, reject) { 
     fs.readFile(path, 'utf8', function (err, data) { 
      resolve({path: path, data: data}) 
     }) 
    }) 
} 

function registerPartial (partial) { 
    var partialName = path.basename(partial.path, '.hbs') 

    handlebars.registerPartial(partialName, partial.data) 
} 

var loadPartials = new Promise(function (resolve, reject) { 

    glob('./views/partials/*.hbs', function (err, files) { 
     Promise.all(files.map(readAsPromise)).then(function (partials) { 
      partials.forEach(registerPartial) 
      resolve() 
     }) 
    }) 

}) 

nun ist die Frage, welche Version von Koa verwenden Sie

// koa 1 

app.use(function* (next) { 
    yield loadPartials 
    yield next 
}) 

// latest koa 

app.use(async (ctx, next) => { 
    await loadPartials 
}) 

jetzt genauso normal partials in Lenker verwenden. Dies funktioniert gut mit Koa-Ansichten, die die gleiche Instanz des Lenkers erfordern

+0

Vielen Dank für Ihre Antwort! Ich benutze 'koa v2'. – Lanti