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.