2012-06-14 28 views
10

Mi piacerebbe che la mia pagina Jade estendesse layout diversi, a seconda delle condizioni. Quindi il mio codice è simile al seguente:nodo jade condizionale jade

if myConditionVariable 
    extends layout1 
else 
    extends layout2 
block content 
    p here goes my content! 

Ora, questo non funziona. Sembra che solo le ultime estensioni definite saranno rispettate, indipendentemente dalle condizioni. Ho provato anche in modo dinamico la definizione del TemplateName, come ad esempio

extends myLayoutNameVariable 

e impostare la myLayoutNameVariable in diversi modi (esprimere la funzione di supporto dinamico, impostarlo come var, var locale ecc ...)

c'è qualche altra soluzione per i layout condizionali o qualcuno può dirmi cosa sto facendo male?

Acclamazioni, simon

+0

Intendevi '- se myConditionVariable' - vedere che meno di' if'? (Lo stesso vale per il ramo 'else'.) Inoltre, probabilmente si intende' append block 'o qualcosa del genere. – elmigranto

risposta

7

Questo sembra essere un problema che è ancora aperto il github.

+0

grazie per il suggerimento! Apparentemente lo stesso vale per include, come i layout e gli include sono risolti in fase di compilazione, non in fase di runtime. – cmonsqpr

0

Puoi fare qualcosa di simile:

if myConditionVariable 
    p test 

?

In caso contrario, si passa myConditionVariable corretto quando si dice di eseguire il rendering di quella vista? Un breve esempio per questo:

app.get "/", (req, res) -> 
    res.render "index", 
    myConditionVariable: true 
+0

Lo sta trasmettendo correttamente. In caso contrario, si verificherebbe l'errore dicendo "myConditionVariable not defined". – elmigranto

11

Quindi, un modo leggermente meno intrusivo per gestire questa situazione è modificare il layout stesso.

ho aggiunto un po 'di middleware, e il resto scorre ..

app.use(function(req, res, next){ 
    res.locals.isAjax = req.headers['x-requested-with'] && 
     req.headers['x-requested-with'] === 'XMLHttpRequest'; 
    next(); 
}); 

Ora che questo è impostato, "isAjax" è a disposizione di giada.

Nel mio "layout.jade" (il modello si estendono da), faccio questo:

- if(!isAjax) 
    doctype 5 
    html 
     head 
     body 
     block content 
     block scripts 
- else 
    block content 
    block scripts 

ho messo a nudo gli altri elementi della piena layout.jade per (si spera) chiarezza.

Infine, le mie normali visualizzazioni che estendono layout.jade funzionano senza modifiche (questo modello di giada include entrambi i casi).

extends layout.jade 
    .container. 
    This is text will be wrapped for a non-ajax request, 
    but not for an ajax request. 
+0

influisce sulle prestazioni? Quando ho esaminato il problema su github collegato sopra sembrava che TJ avesse detto che Express non avrebbe messo in cache le pagine. Mi spiace sollevare una vecchia domanda dalla morte. – mshindal

+1

@mshindal - Non sono sicuro di come rispondere alla tua domanda, ci sono molte parti in questo: 1) La compilazione JADE è la stessa di prima, quindi più codice template, ma non ha un impatto enorme. 2) Dipende da come è configurata la memorizzazione nella cache, se si sta utilizzando ETags, sarà necessario tenere conto di questa intestazione nel generare l'etag, ma onestamente, penso che questa soluzione sia ortogonale ai problemi di memorizzazione nella cache. Quindi .. la mia risposta sarebbe "no, non ha impatto sulle prestazioni" –

+0

Solo così sai, esprima espone 'req.xhr' che controlla l'intestazione' x-requested-with' per te;) – Chev

3

Spero che non sia troppo tardi, ma mi sono imbattuto in questo problema e penso di aver capito una soluzione:

  1. Fai un layout.jade che include conditionaly entrambi i layout:

    layout.jade: 
    
    if conditionalVariable 
        include firstLayout.jade 
    else 
        include otherLayout 
    
  2. Nella visualizzazione, estendere layout.jade e definire conditionalVariable nel controller (true/false):

    view.jade: 
    
    extends layout 
    
    block content 
        p here goes my content! 
    
  3. Disco!

+0

Che dire di estensioni, ho provato per estendere firstLayout ma non ha funzionato –