-
Notifications
You must be signed in to change notification settings - Fork 479
Home
Welcome to the dustjs wiki!
Dust Templating provides to features to resuse and write DRY markup. Here are some of the concepts that can be used together to create resusable dust widgets/ modules.
Dust by default allows template inheritance with the concept of partials and inline partials
partial.tl ( this serves as the base template )
{+greeting} Hola {/greeting}
{+world} World {/world}
main_without_override.tl ( this serves as the child template )
{>partial/}
output
When the main_without_override.tl is rendered ...
Hola World
{>partial/}
{<greeting}
Hello
{/greeting}
output
When the main_with_override.tl is rendered ...
Hello World
main_with_loops.tl
{>partial/}
{#projects
{<greeting}
Hello {.name}
{/greeting}
{/projects}
{<world}{/world} {! override to print nothing !}
output
When the main_with_loops.tl is rendered ... ( says projects has three entries with the name field )
Hello project 1 Hello project 2 Hello project 3
base.tl
{+greeting}hello{/greeting}
{+world/}
footer.tl
Common footer
base_end.tl
{>"footer"/}
{+bye} bye {/bye}
main.tl
{>"head"/}
BODY
{>"foot"/}
head.tl
{>"base"/}
{<world} World {/world}
START
foot.tl
END
{>"base"/}
{<greeting}bye{/greeting}
foot_with_no_end.tl
END
{>"base_end"/}
{<bye} {! Do not print bye | }{/bye}
output ( when I render main.tl with foot.tl )
hello World START BODY END bye
output ( when I render main.tl with foot_with_no_end.tl )
hello World START BODY END common footer
{^xhr}
{>base_template/}
{:else}
{+main/}
{/xhr}
{<title}
Child Title
{/title}
{<main}
Child Content
{/main}
The name of the partial can be determined at render time. Primarily useful when a partial is loaded based on the ab-test key.
{>"/path/{abkey}.tl"/}
Dynamic Partials allow to conditionally chose between oen block or other block of markup based on the context. Since dust is inherently logic less, dynamic partials allow us to write conditional markup that can be reused based on current context.
Most often we tend to reuse the same data in the template again and again ... One way to avoid been repetitive is use aliases. So a common question was, how does dust support this ?
Well, in dust there is more than one way neat way to do this.
Use Inline Partials
Inline partials never output content themselves, and are always global to the template in which they are defined, so the order of their definition has no significance.
Key points to note : They are global to the template., there is no ordering and can be defined anywhere
Step 1 create global alias
{<greeting}Hello, Hola{/greeting}
Step 2
{#names}
{.} {+greeting/}
{/names}
{#projects}
{.} {+greeting/}
{/projects}
Inline parameters appear within the section's opening tag. Parameters are separated by a single space.
{#profile bar="baz" bing="bong"}
{name}, {bar}, {bing}
{/profile}
There are 3 flavors
{#test greeting="hello"} // constant hello
{greeting}
{/test}
{#test greeting=hello} // looks for a json context hello in the JSON hierarchy
{greeting}
{/test}
{#test greeting="{hello}"} // resolves hello when greeting is referenced in the block and it resolves to the first one in the hierarchy
{greeting}
{/test}
Dust supports the exists (?) and not exists (^?). Nested exists block easily allow for (exp1 AND exp2 AND exp3), but (exp1 OR exp2 ) is not possible.@if helper comes handy in cases where an OR operation is required.
Example 1:
{@if cond="('{x}'.length || '{y}'.length ) || (2 > 3) && {a}-{b} == 9"}
render if
{:else}
render else
{/if}
Example 2: Inside lists of primitives,$idx and $len cannot be used, and {@idx} can be used instead
JSON : {"skills": ["jasmine", "qunit", "javascript"]}
{#skills}
<li>
<span class='{@idx}
{@if cond="{.} == '{skills}'.split(',').length -1"}
last
{/if}
{/idx}'>
{.}</span>
</li>
{/skills}
Example 5: @if with else
{@if cond="'{names}'.split(',').length == 3 "}
{@i18n key="yes" text="Yes, there are 3 names"/}
{:else}
{@i18n key="no" text="No, there are less than 3 names"/}
{/if}