Handlebars.js 다른 경우


241

클라이언트 측면보기 렌더링을 위해 Handlebars.js를 사용하고 있습니다. Else가 훌륭하게 작동하지만 ELSE IF가 필요한 3 가지 조건부 조건이 발생하면 :

작동하지 않습니다.

{{#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}}

핸들 바로 ELSE IF를 수행하려면 어떻게해야합니까?


: 핸들 업데이트에 눈을 유지, 곧 구현 될 것 같다 github.com/wycats/handlebars.js/pull/892
야곱 반 Lingen의를

답변:


376

핸들 바는 {{else if}}3.0.0부터 블록을 지원합니다 .

핸들 바 v3.0.0 이상 :

{{#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}}

그러나 Handlebars v3.0.0 이전에는 분기 논리를 처리하는 도우미를 정의하거나 중첩 if명령문을 수동으로 정의 해야합니다.

{{#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
핸들 바에 elsif (또는 다른 경우)가 없어서 템플릿에 너무 많은 논리를 넣는 점입니다. 다시 말해, 작은 템플릿으로 분류해야합니까?
Kazim Zaidi

1
@KazimZaidi, 세 가지 이상의 상태를 가진 단일 데이터가 각 경우에 다른 형식을 요구하는 경우 어떻게해야합니까? CSS 스타일을 데이터 자체에 적용 할 수 있지만 뷰 수준 문제를 데이터에 적용하고 있습니다. if / elseif / endif 구문 (또는 스위치 / 일치)에 대한 합리적인 사례를 상상할 수 있습니다.
Drew Noakes

1
이것을 다시 보면, 속성 바인딩을 통해 이것이 가능하다고 생각합니다.
Kazim Zaidi

1
선호하는 방법은 부울 플래그를 전달하고 조건을 지정하는 것입니다. 하나의 조건 만 true로 평가되도록 플래그를 올바르게 설정하는 것은 사용자의 몫입니다. 필요 없음else if
chovy

비즈니스 로직과 프리젠 테이션을 분리하는 도우미 기능을 사용하여이 작업을 수행하는 것이 좋습니다.
Max Hodges

76

나는 보통이 양식을 사용한다 :

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

좋은 팁, 감사합니다. 이것이 기본적으로 반응합니까?
kylemclaren

2
다음과 같은 경우에는 1로만 예쁘게 보이지만, 더 많이 가질수록 마지막 닫는 목록의 목록이 길어집니다.{{/if}}{{/if}}{{/if}}{{/if}}{{/if}}
jbyrd

1
아니, 그것은 더 깨끗하지 않다.
유전자 b.

37

핸들 바는 이제 {{else if}}3.0.0부터 지원합니다 . 따라서 코드가 작동합니다.

"조건부"아래에 예제가 있습니다 (여기서 약간 수정 됨 {{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
이것이 새로운 답변이어야합니다!
Saad Malik

나를 위해 작동하지 않습니다 (템플릿의 구문 오류). Meteor 1.2.0.2
dragonmnl

@dragonmnl Meteor 1.2.0.2는 어떤 버전의 핸들 바를 사용합니까? 3.0을 사용하고 있는지 확인하십시오.
Don O

기본 버전을 사용하고 있습니다. 핸들 바 버전은 어떻게 확인합니까?
dragonmnl

@dragonmnl Meteor가 Spacebars 라는 자체 템플릿 언어를 사용하는 것 같습니다 . 이 경우 {{else if}}구문을 지원하는지 잘 모르겠습니다 .
Don O

37

핸들 바의 정신은 "논리적"이라는 것입니다. 때때로 이것은 우리가 우리와 싸우는 것처럼 느끼게하고 때로는 추악한 중첩 된 if / else 논리로 끝납니다. 당신은 할 수 도우미를 쓰기; 많은 사람들이 "더 나은"조건부 연산자로 핸들 바를 늘리거나 그것이 핵심의 일부라고 생각합니다 . 하지만 이것 대신에

{{#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}}

이를 위해 모델에 물건을 배치하고 싶을 수도 있습니다.

{{#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}}

이 플래그 중 하나만 사실인지 확인하십시오. 당신이 if/elsif/else당신의 관점에서 이것을 사용한다면 아마도 다른 곳에서도 그것을 사용할 것이므로, 이러한 변수는 불필요한 것이 아닐 수도 있습니다.

마른 상태로 유지하십시오.


1
나는 그것이 얼마나 좋은 연습인지 잘 모르겠지만, 오늘 3 가지 다른 뷰 상태를 처리하고 나 에게이 문제에 근거한 솔루션을 사용하게되었습니다 (그들이 모두 점검하기 때문에 논리가 필요하지 않은 경우 하나의 값) stackoverflow.com/questions/15008564/… 따라서 #if _is_friend 대신 매우 간단한 도우미 (답변에)가있는 문자열을 사용할 수 있습니다. #if friend_type "is_friend"및 #if friend_type "is_not_friend_yet"
Dylan Reich

이 답변은 내가 최고의 솔루션 사전 핸들 바 3.0을 고려할 것입니다. 논리를 DOM 트리에 넣는 것보다 추가 HTML이 더 낫다고 생각합니다.
David O'Regan

7

이 간단한 도우미를 작성했습니다.

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);
  }
});

핸들 바의 Chain of Responsibility 패턴 과 같습니다.

예:

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

그것은 아니에요 경우 다른 사람 이 당신을 도울 수 있지만 경우에 따라)


1

내장 헬퍼

#if

if 도우미를 사용하여 조건부로 블록을 렌더링 할 수 있습니다. 인수가 false, undefined, null, "", 0 또는 []를 반환하면 핸들 막대는 블록을 렌더링하지 않습니다.

주형

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

위의 템플릿에 다음 입력을 전달할 때

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

0

안녕하세요, MINOR 클래스 이름 만 편집했습니다. 지금까지 iv를 공개했습니다. 나는 도우미에 다중 매개 변수를 전달해야한다고 생각합니다.

server.js

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

header.handlebars

<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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.