2011-09-27 19 views
33

Estoy tratando de hacer que todo lo demás, aparte del primer elemento de una matriz, tenga una clase de CSS usando el motor de plantillas de Jade.Jade Inline Conditional

Esperaba poder hacerlo así, pero no tuve suerte. ¿Alguna sugerencia?

- each sense, i in entry.senses 
    div(class="span13 #{ if (i != 0) 'offset3' }") 
    ... a tonne of subsequent stuff 

Sé que podría envolver el código como abajo, pero por lo que entiendo las reglas de anidación de Jade para trabajar, tendría que duplicar el código o extraerlo a un Mixin o algo así.

- each sense, i in entry.senses 
    - if (i == 0) 
    .span13 
     ... a tonne of subsequent stuff 
    - else 
    .span13.offset3 
     ... identical subsequent stuff 

¿Hay una mejor manera de hacerlo?

+1

btw- ¿por qué escribes las mismas cosas idénticas de nuevo para cada 'si'? – vsync

Respuesta

44

Usted puede hacer esto en su lugar:

- each sense, i in entry.senses 
    - var klass = (i === 0 ? 'span13' : 'span13 offset3') 
    div(class=klass) 
    ... a tonne of subsequent stuff 
+0

Eres un genio. ¿Cómo no pensé en eso? –

+0

No se preocupe, me golpeé la cabeza en este mismo problema un par de veces antes de darme cuenta de que podía salirme con la mía. :) – ctide

+0

+1. Tan simple, no sé por qué no pensé en hacer esto. – Menztrual

20

Esto funciona también:

div(class="#{i===0 ? 'span13' : 'span13 offset3'}") 
+0

+1, funciona bien. –

2

Ésta es mi solución. Estoy usando un mixin para pasar la ruta activa actual y en la mezcla, defino el menú completo y siempre paso un si para verificar si la ruta es la ruta activa.

mixin adminmenu(active) 
    ul.nav.nav-list.well 
    li.nav-header Hello 
    li(class="#{active=='/admin' ? 'active' : ''}") 
     a(href="/admin") Admin 
24

Esto también funciona:

div(class=(i===0 ? 'span13' : 'span13 offset3')) 
1

Puede utilizar, no sólo class, pero un montón de atributos de una manera condicional:

- each sense, i in entry.senses 
    - var attrs = i === 0 ? {'disabled': 'true'} : {'class': '100', 'ng-model': 'vm.model.name', 'ng-click': 'vm.click()'} 
    div&attributes(attrs) 
0

Yo prefiero usar funciones simples para verificar cualquier condición compleja. Funciona de manera perfecta y rápida, no debe escribir líneas largas en la plantilla. puede sustituir este

- each sense, i in entry.senses 
    - var klass = (i === 0 ? 'span13' : 'span13 offset3') 
    div(class=klass) 
    ... a tonne of subsequent stuff 

a este

-function resultClass(condition) 
-if (condition===0) 
    -return 'span13' 
-else if (condition===1) 
    -return 'span13 offset3' 
-else if (condition===2) //-any other cases can be implemented 
    -return 'span13 offset3' 
-else 
    -return 'span13 offset3' 

- each sense, i in entry.senses 
    div(class=resultClass(i)) 
    ... a tonne of subsequent stuff 

Espero que ayuda y la idea es clara de entender.

También es una buena práctica para mover todas las funciones en el archivo de inclusión y compartirlo entre diferentes plantillas, pero es otra pregunta