2012-10-31 7 views
19

Zacząłem używać Handlebars.js. Wydaje się, że nie ma wbudowanych warunkowych, jak w innych przypadkach. chcę mieć coś takiegoJS niestandardowy helper kierownicy dla innego, jeśli

{{#if type.one }} 
    do something ... IF 
{{else if type.two}} 
    do something ... ELSE IF 
{{else}} 
    do something ... ELSE 
{{/if}} 

Ale to nie działa. Jak zrobić ELSE IF z kierownicą? Czy pisanie niestandardowego pomocnika jest jedyną opcją? Jeśli tak, proszę podać kilka wskazówek do napisania tego pomocnika.

Odpowiedz

20

Nie można tego zrobić przy użyciu niestandardowego pomocnika, jako że pomocnicy, którzy są pomocnikami, rozumieją tylko dwie części: część "jeśli" i część "inną". Możesz jednak zagnieździć się w jednym miejscu:

{{#if type.one}} 
    do something ... IF 
{{else}} 
    {{#if type.two}} 
     do something ... ELSE IF 
    {{else}} 
     {{#if type.three}} 
      ... 
     {{else}} 
      ... 
     {{/if}} 
    {{/if}} 
{{/if}} 

Tego typu rzeczy będą szybko nieprzyjemne, więc prawdopodobnie nie chcesz tego robić. Lepszym rozwiązaniem byłoby (jak zwykle w przypadku Handlebars) przeniesienie logiki do JavaScript tak, aby co najwyżej jedna z type.one, type.two, type.three, ... byłaby prawdziwa; następnie można:

{{#if type.one}} 
    ... 
{{/if}} 
{{#if type.two}} 
    ... 
{{/if}} 
{{#if type.three}} 
    ... 
{{/if}} 

Jeśli masz wiele opcji dla type lub jeżeli organy w swoim {{#if}} s są skomplikowane, można przełączyć się podszablonów. Trzeba dodać niestandardowego pomocnika, aby zbudować częściową nazwę opartą na zmiennej szablonu; coś takiego:

Handlebars.registerHelper('show_type', function(type) { 
    var types = ['one', 'two', 'three']; 
    var partial; 
    for(var i = 0; i < types.length; ++i) { 
     if(!type[types[i]]) 
      continue; 
     partial = '_partial_' + types[i]; 
     break; 
    } 
    if(partial) 
     return Handlebars.partials[name](this); 
    else 
     return ''; 
}); 

a następnie, zakładając swoje partials są zarejestrowane i konsekwentnie nazwie, można powiedzieć:

{{show_type type}} 
1

Można to zrobić:

{{#if type.one}} 
    ... 
{{else}} {{#if type.two}} 
    ... 
{{else}} {{#if type.three}} 
    ... 
{{else}} 
    ... 
{{/if}}{{/if}}{{/if}} 
0

dokładnej składni napisany przez OP będzie działał w Ember Canary dzisiaj z włączoną flagą funkcji ember-htmlbars-inline-if-helper.

1

Jeśli chcesz zachowanie przełącznika, może być zainteresowany w Dan Harper's helpers, będzie w stanie zrobić coś takiego:

{{#is type 1}} 
    <p>Do something when 1.</p> 
{{else}}{{#is type 2}} 
    <p>Do something when 2.</p> 
{{else}}{{#is type 3}} 
    <p>Do something when 3.</p> 
{{/is}}{{/is}}{{/is}} 

Oto jsfiddle.