2010-08-30 15 views
11

Temel bir Express sunucusuna sahibim:Express'teki bir şablondan içeriğe nasıl geçiş yapabilirim?

Temel bir yeşim düzeni ile:

// views/layout.jade: 
!!! 5 
html(lang='en') 
    head 
    title= pageTitle 
    body 
    h1= pageTitle 
    aside(id="sidebar")= sidebarContent 
    #content 
     #{body} 

Ve basit bir sayfa:

# views/welcome.jade: 
// How do I pass pageTitle and sidebarContent out to the layout from here? 
p 
    Welcome to my fine site! 

(Rails'de content_for gibi bir şey olabilir veya basit bir örnek değişkeni.)

+0

iyi çalışır, belki de yararlı ise yerleşim ve yeşim için destek inşa ettiği gibi göreceksiniz. https://github.com/balupton/docpad – balupton

cevap

19

olsa sayfa görüntüleme ve kapanışları sihirli hem mevcuttur, ben istek nesnesini içeren olmadan çalışır oldukça zarif çözüm buldu. Buradaki ipucu, sayfa başlığı değişkenini etrafındaki get() ve set() işlevini sağlayan bir kapamaya sarmak ve bu sarmalayıcı nesnesini page_title dinamik yardımcısının sonucunu yapmaktır. ,

exports.create = function() { 
    var value = null; 
    return { 
     get: function() { 
      return value; 
     }, 
     set: function (new_value) { 
      value = new_value; 
     } 
    }; 
} 

Yani) (oluşturmak çağıran üzerinde bir get() ve set() metodu ile bir nesne döndürür almak ve kapatma değişkeni ayarlayın:

bir property.js oluşturun.

Ardından, uygulamanın ayar kodunda:

var property = require("./property.js"); 
    app.dynamicHelpers ({ 
     page_title: function() { 
     return property.create(); 
     } 
    }); 

dinamik Yardımcısı'nın değeri beri görünümü ve şablonda, onun işlevini çağırarak sonucudur, page_title değişken (get sarıcı nesne olacak) ve set() işlevleri.

- page_title.set ("my specific page title"); 

Ve mizanpajınızda: Size göre

, daha sonra söyleyebiliriz

exports.creator = function() { 
    return function() { 
     return exports.create(); 
    }; 
} 
:

title= page_title.get() 

property.js bu ekleyerek, biraz daha bu basitleştirmek için

Dinamik yardımcılar bildirimi engellemesini şu şekilde basitleştirmenizi sağlar:

 var property = require("./property.js"); 
     app.dynamicHelpers ({ 
      page_title: property.creator() 
     }); 
+0

Karşılaştığım kapakların en pratik kullanımlarından biri! –

+0

Bunu gerçekten resimde nasıl kullandınız? Bu fikri sevdim, ama benim için set() işlevi asla çağrılmıyor ve get() her zaman boştur. – qodeninja

0

Geçiş halk içinde: {some: 'Locals', pageTitle: 'Welcome!'}

+0

Bu şablon içinden 'yerlilerim yok. Bir '{şablon yolu: sayfa başlığı}' haritasına sahip olmalıyım ve görüntülemeden önce sayfa başlığına bakmalıyım. Şablonun kendisinde * belirtmek için bir yol olmalıdır. –

5

Ekspres o raylar içinde aramak ne olursa olsun "bloklar" veya bir önyargıya sahip değildir, ancak yardımcıları() ve dynamicHelpers() benzer bir şey elde etmek bir arada kullanabilirsiniz http://expressjs.com/guide.html#app-helpers-obj-

geçti

Yerliler düzeni ve dynamicHelpers hakkında yukarıdaki ucu kullanarak

+0

Öyleyse buradaki fikir, 'pageTitle' öğesini istekte saklayan dinamik bir yardımcı eklemek; Bu iyi bir çözüm gibi geliyor. Bir ara yazılım olarak bile kullanabilirim ve yayınlayabilirim! –

1

Bu küçük parçacığı kullanarak bunu yapabilirsiniz.

prop.js:

var hash = {}; 
module.exports = function() { 
    return { 
     set: function(key, val) { hash[key] = val }, 
     get: function(key) { return hash[key] } 
    }; 
}; 

sunucusu.js:

app.dynamicHelpers({ prop: require(__dirname + '/views/helpers/prop') }); 

Görünüm:

<% prop.set('foo', 'bar') %> 

Düzen:

<%= prop.get('foo') %> 
2

layout.jade

# the following function is a safe getter/setter for locals 
- function pagevar(key, value) { var undef; return (value===undef) ? locals[key] || null : locals[key] = value; } 
block config 
    #intended as a non-rendered block so that locals can be overridden. 
    # put your defaults here... - use append in the child view 
!!! 
html 
    head 
    title=pagevar('title') 
    meta(name='description',content=pagevar('description')) 
...

page.jade

append config 
    - locals.title = 'override'; 
    - locals.description = 'override 2'; 
    - pagevars('somekey', 'some value'); 
...

Easy peazy. o DocPad dayalı bir cms olsa Ekspres 3 şablonu agnostik için

0

, express-partials

app.use (req, res, next)-> 
    req.locals = {} unless req.locals 

    res.locals.content_for = (k, v = null)-> 
    if !v 
     req.locals[k] 
    else 
     req.locals[k] = v 

    next() 
İlgili konular