2011-11-13 14 views
12

Mam obiekt właściwości typu mieszanego - niektóre ciągi, niektóre tablice ciągów, niektóre obiekty zawierające tablice ciągów - które mogą potencjalnie przejść na wiele poziomów.Rekursywna iteracja nad obiektem w szablonie Jade?

Chciałbym iterować nad wszystkimi właściwościami, tak aby obiekt tworzył div, tablica tworzy element div, a właściwość string tworzy zakres, w którym znajduje się tekst.

{ "string" : "some text", "object" : { "array" : [ "text" ] } } 

Powyższy cel uczyniłoby jak:

<span>some text</span> 
<div> 
    <div> 
    <span>text</span> 
    </div> 
</div> 

ale zazwyczaj znacznie bardziej złożonych struktur. Jak powinienem osiągnąć ten cel to Jade?

Odpowiedz

13

Minęło trochę czasu, odkąd zapytałeś, ale myślę, że jest to Twój przyjaciel, mixin. Nie próbowałem go, ale jeśli wstawek wspierać rekurencji, to powinno działać:

mixin parseObject(obj) 
    div 
    - each val, key in obj 
     - if (typeof val === 'string') 
     span #{val} 
     - else if (typeof val === 'object') 
     mixin parseObject(val) 

Następnie w treści pliku .jade, zadzwoń mixin parseObject(rootObject).

+1

3rd party tutaj. Próbowałem tego, ale mixin nie lubi rekurencji :( –

+0

@Robert Martin: To jest teraz :) –

+0

Jako oryginalny plakat, zaktualizowałem twój kod, aby zawrzeć 'mixin' (dziękuję ** 0x80 **) i odpowiednie przedrostki '-'. –

5

Rekursja wydaje się teraz wspierana. Z powodzeniem wykorzystałem tę funkcję z drobną korektą; musisz użyć słowa kluczowego mixin podczas wywoływania funkcji.

mixin parseObject(obj) 
    div 
    each val, key in obj 
     if typeof val === 'string' 
     span #{val} 
     else if typeof val === 'object' 
     mixin parseObject(val) 
5

W nowoczesnej wersji Jade to wyglądać

mixin parseObject(obj) 
    div 
    each val in obj 
     if typeof val === 'string' 
     span= val 
     else if typeof val === 'object' 
     +parseObject(val) 

Następnie w treści pliku .jade, zadzwoń

+parseObject(rootObject)