Handlebars.js Else If


241

Używam Handlebars.js do renderowania widoku z boku klienta. Jeśli jeszcze działa świetnie, ale napotkałem warunek 3-drogowy, który wymaga ELSE JEŻELI:

To nie działa:

{{#if FriendStatus.IsFriend }}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else if FriendStatus.FriendRequested}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
{{else}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
{{/if}}

Jak zrobić ELSE IF z kierownicą?


Miej oko na aktualizacje kierownicy, wygląda na to, że zostaną wkrótce wprowadzone: github.com/wycats/handlebars.js/pull/892
Jacob van Lingen

Odpowiedzi:


376

Kierownica obsługuje {{else if}}bloki od 3.0.0.

Kierownice w wersji 3.0.0 lub nowszej:

{{#if FriendStatus.IsFriend}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else if FriendStatus.FriendRequested}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
{{else}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
{{/if}}

Przed Handlebars v3.0.0 należy jednak zdefiniować pomocnika, który ifręcznie obsługuje logikę rozgałęzienia lub instrukcje zagnieżdżenia :

{{#if FriendStatus.IsFriend}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else}}
  {{#if FriendStatus.FriendRequested}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
  {{else}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
  {{/if}}
{{/if}}

6
polega na tym, że w kierownicy nie ma elsif (a jeśli tak), to zbyt dużo logiki w szablonie. Innymi słowy, musisz podzielić go na mniejsze szablony?
Kazim Zaidi,

1
@KazimZaidi, co zrobić, jeśli masz jeden kawałek danych z więcej niż trzema stanami, który wymaga innego formatowania w każdym przypadku? Być może możesz wymusić styl CSS w samych danych, ale wtedy przesuwasz obawy na poziomie widoku do swoich danych. Potrafię sobie wyobrazić rozsądne przypadki konstrukcji if / elseif / endif (lub nawet zmiany / dopasowania).
Drew Noakes,

1
patrząc na to ponownie, czuję, że można to zrobić poprzez powiązanie atrybutów.
Kazim Zaidi,

1
Myślę, że preferowaną metodą jest przekazywanie flag boolowskich i ich warunkowanie. Od Ciebie zależy prawidłowe ustawienie flag, tak aby tylko jeden warunek był spełniony. Nie ma potrzebyelse if
chovy

Polecam to zrobić za pomocą funkcji pomocniczej, aby oddzielić logikę biznesową od prezentacji.
Max Hodges

76

Zwykle używam tego formularza:

{{#if FriendStatus.IsFriend}}
  ...
{{else}} {{#if FriendStatus.FriendRequested}}
  ...
{{else}}
  ...
{{/if}}{{/if}}

Dobra rada, dzięki. Czy byłoby to domyślnie reaktywne?
kylemclaren

2
Wygląda ładnie z tylko jednym innym, jeśli, ale im więcej masz, tym dłuższa jest ostatnia lista zamykania jeśli -{{/if}}{{/if}}{{/if}}{{/if}}{{/if}}
jbyrd

1
Nie, to nie jest „czystsze”, jest brzydsze.
gen b.

37

Kierownice obsługują teraz {{else if}}od 3.0.0. Dlatego twój kod powinien teraz działać.

Możesz zobaczyć przykład w „Warunkach” (nieco poprawiony tutaj z dodanym {{else}}:

    {{#if isActive}}
      <img src="star.gif" alt="Active">
    {{else if isInactive}}
      <img src="cry.gif" alt="Inactive">
    {{else}}
      <img src="default.gif" alt="default">
    {{/if}}

http://handlebarsjs.com/block_helpers.html


4
To powinna być nowa odpowiedź!
Saad Malik,

nie działa dla mnie (błąd składniowy w szablonie). Meteor 1.2.0.2
dragonmnl

@dragonmnl Której wersji kierownicy używa Meteor 1.2.0.2? Upewnij się, że korzystasz z wersji 3.0.
Don O

Używam wersji domyślnej. Jak sprawdzić wersję kierownicy?
dragonmnl,

@dragonmnl Wygląda na to, że Meteor używa własnego języka szablonów zwanego Spacjami . W takim przypadku nie jestem pewien, czy obsługuje on {{else if}}składnię.
Don O

37

Duch kierownicy polega na tym, że jest „bez logiczna”. Czasami sprawia to, że czujemy się, jakbyśmy z tym walczyli, a czasem kończy się brzydka zagnieżdżona logika if / else. Ty mógł napisać pomocnika; wiele osób rozszerza kierownicę o „lepszy” operator warunkowy lub uważa, że ​​powinien on być częścią rdzenia . Myślę jednak, że zamiast tego

{{#if FriendStatus.IsFriend}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else}}
  {{#if FriendStatus.FriendRequested}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
  {{else}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
  {{/if}}
{{/if}}

możesz zaaranżować rzeczy w swoim modelu, abyś mógł to mieć,

{{#if is_friend }}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{/if}}

{{#if is_not_friend_yet }}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
{{/if}}

{{#if will_never_be_my_friend }}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
{{/if}}

Upewnij się tylko, że tylko jedna z tych flag jest zawsze prawdziwa. Możliwe, że jeśli używasz tego if/elsif/elsew swoim widoku, prawdopodobnie używasz go również w innym miejscu, więc te zmienne mogą nie być zbędne.

Trzymaj to szczupłe.


1
Nie jestem pewien, jak dobra jest to praktyka, ale dzisiaj przyszło mi to do czynienia z 3 różnymi stanami widoku i skończyłem na rozwiązaniu opartym na tym (ich logika elseif nie jest konieczna, ponieważ wszystkie sprawdzają w porównaniu jedna wartość) stackoverflow.com/questions/15008564/... Tak więc zamiast # if _is_friend możesz użyć łańcucha z bardzo prostym pomocnikiem (w odpowiedzi); # jeśli typ_ przyjaciela "is_friend" i # jeśli typ_ przyjaciela "is_not_friend_yet"
Dylan Reich

Oto odpowiedź, którą uważam za najlepsze rozwiązanie przed kierownicą 3.0, myślę, że dodatkowy HTML jest lepszy, niż próbować wcisnąć logikę w drzewo DOM.
David O'Regan

7

Napisałem tego prostego pomocnika:

Handlebars.registerHelper('conditions', function (options) {
    var data = this;
    data.__check_conditions = true;
    return options.fn(this);
});


Handlebars.registerHelper('next', function(conditional, options) {
  if(conditional && this.__check_conditions) {
      this.__check_conditions = false;
      return options.fn(this);
  } else {
      return options.inverse(this);
  }
});

Jest to coś w rodzaju wzoru łańcucha odpowiedzialności w kierownicach

Przykład:

    {{#conditions}}
        {{#next condition1}}
            Hello 1!!!
        {{/next}}
        {{#next condition2}}
            Hello 2!!!
        {{/next}}
        {{#next condition3}}
            Hello 3!!!
        {{/next}}
        {{#next condition4}}
            Hello 4!!!
        {{/next}}
    {{/conditions}}

Nie jest inaczej, ale w niektórych przypadkach może ci pomóc)


1

Wbudowane pomocniki

#if

Możesz użyć pomocnika if, aby warunkowo renderować blok. Jeśli jego argument zwróci false, niezdefiniowany, null, „”, 0 lub [], kierownice nie renderują bloku.

szablon

<div class="entry">
  {{#if author}}
    <h1>{{firstName}} {{lastName}}</h1>
  {{else}}
    <h1>Unknown Author</h1>
  {{/if}}
</div>

Po przekazaniu następujących danych wejściowych do powyższego szablonu

{
  author: true,
  firstName: "Yehuda",
  lastName: "Katz"
}

0

Cześć, mam tylko MAŁĄ edycję nazwy klasy i jak do tej pory iv ją ujawniłem. myślę, że muszę przekazać pomocnikowi parametry w wielu plikach,

server.js

app.engine('handlebars', ViewEngine({
        "helpers":{
                isActive: (val, options)=>{
                    if (val === 3 || val === 0){
                        return options.fn(this)
                    }
                } 
        }
}));

nagłówek. uchwyty

<ul class="navlist">
          <li   class="navitem navlink {{#isActive 0}}active{{/isActive}}"
                ><a href="#">Home</a></li>
          <li   class="navitem navlink {{#isActive 1}}active{{/isActive}}"
                ><a href="#">Trending</a></li>
          <li   class="navitem navlink {{#isActive 2}}active{{/isActive}}"
                ><a href="#">People</a></li>
          <li   class="navitem navlink {{#isActive 3}}active{{/isActive}}"
                ><a href="#">Mystery</a></li>
          <li class="navitem navbar-search">
            <input type="text" id="navbar-search-input" placeholder="Search...">
            <button type="button" id="navbar-search-button"><i class="fas fa-search"></i></button>
          </li>
        </ul>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.