2011-09-02 11 views
27

Qual è il modo migliore per verificare la presenza di una proprietà non definita in un modello EJS?Come verificherebbe la proprietà non definita in ejs per node.js?

(sto usando il node.js package da TJ Holowaychuk)

Esempio:

var tpl = '<% if (foo) { %>foo defined<% } else { %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz" } })); 

mi aspetto questo di rendere "foo indefinito". Si genera invece un errore foo non definito.

So che questo non dovrebbe essere un problema, poiché questo è il comportamento previsto in the tests. C'è un modo semplice per evitarlo?

L'unica soluzione che ho trovato è l'utilizzo del metodo hasOwnProperty.

var tpl = '<% if (hasOwnProperty("foo")) { %>foo defined<% } else { %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 

Questo non genera alcun errore.

C'è un modo migliore per mantenere pulito il modello? O perché genera questo errore?

risposta

49

Un altro modo per testare una proprietà è per farvi riferimento indirettamente attraverso l'oggetto locals . Usando il tuo esempio:

var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 
+0

Questo è quello che volevo. :) – pvorb

+6

Proprio quello di cui avevo bisogno, ma wtf, perché devi farlo ?! :) –

+0

Non sono sicuro di aver controllato la fonte, ma ho il sospetto che il motore di template non si preoccupi delle variabili scope per i valori non definiti. I locatari –

15

Vorrei utilizzare typeof, come in if (typeof foo == 'undefined'). Io uso l'operatore typeof con la stringa "non definita", mentre alcune persone potrebbero fare un confronto diretto con la variabile globale undefined. Preferisco questo metodo perché è protetto da alcuni sviluppatori di librerie JS terroristiche che cambiano il valore della variabile globale, lasciando il tuo codice rotto.

Questo potrebbe anche essere espresso come ternario, che alcuni vista come "pulito" a causa dell'assenza di curlies:

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<%) %>'; 
+1

Questo funziona e forse è il formalmente corretta. Ma personalmente non mi piace, dato che è troppo lungo per i miei modelli. – pvorb

+1

Si noti che questo è l'unico metodo che funziona con i modelli EJS lato client. Gli altri metodi si basano sul controllo dell'oggetto 'res' che non esiste con i modelli lato client. – dbasch

9

più semplice, e più pulito, a mio parere:

<%= (!!locals.foo)?foo:'' %>

+3

sembrano essere passati all'oggetto res nelle versioni successive di ejs. – dbasch

Problemi correlati