핸들 바에서 객체 배열을 반복하는 방법은 무엇입니까?


108

이것은 어리석은 질문처럼 보일지 모르지만 어디에서도 답을 찾을 수없는 것 같습니다.

JSON 형식으로 객체 배열을 반환하는이 웹 API를 사용하고 있습니다.

객체 배열

Handlebars 문서는 다음 예를 보여줍니다.

<ul class="people_list">
  {{#each people}}
  <li>{{this}}</li>
  {{/each}}
</ul>

문맥 상에:

{
  people: [
    "Yehuda Katz",
    "Alan Johnson",
    "Charles Jolley"
  ]
}

제 경우에는 배열 이름이 없으며 응답의 루트 객체 일뿐입니다. 나는 {{#each}}운없이 사용해 보았습니다 .

핸들 바를 처음 사용하는 경우 ... 무엇을 놓치고 있습니까?

최신 정보

다음은 내가 묻는 것을 보여주는 간단한 바이올린입니다. http://jsfiddle.net/KPCh4/2/

핸들 바는 컨텍스트 변수가 배열이 아닌 객체 여야합니까?


API 결과를 템플릿 ( 현재 )에 어떻게 전달합니까?
Gabriele Petrioli

@ GabyakaG.Petrioli API는 내 것이 아니며 제어 할 수 없습니다. 나는 jQuery ajax를 사용하고 객체 배열 인 응답 객체를 얻고 있습니다.
emzero 2014 년

답변:


156

this각 블록에 전달할 수 있습니다 . 여기를 참조하십시오 : http://jsfiddle.net/yR7TZ/1/

{{#each this}}
    <div class="row"></div>
{{/each}}

그러면 {{#each people}}내부 루프 내부의 외부 루프의 인덱스 번호를 호출 할 수 {{#each this}}있습니까? 마찬가지로{{people@index}}
RegarBoy

17

이 바이올린에는 each직접 json이 있습니다. http://jsfiddle.net/streethawk707/a9ssja22/ .

다음은 배열을 반복하는 두 가지 방법입니다. 하나는 직접 json 전달이고 다른 하나는 콘텐츠 홀더에게 전달하는 동안 json 배열의 이름을 지정하는 것입니다.

예 1 : 아래 예제는 small_data 변수 내에서 json 키 (데이터)를 직접 호출하는 것입니다.

HTML에서 아래 코드를 사용하십시오.

<div id="small-content-placeholder"></div>

아래는 html의 헤더 또는 본문에 배치 할 수 있습니다.

<script id="small-template" type="text/x-handlebars-template">
    <table>
        <thead>
            <th>Username</th>
            <th>email</th>
        </thead>
        <tbody>
            {{#data}}
                <tr>
                    <td>{{username}}
                    </td>
                    <td>{{email}}</td>
                </tr>
            {{/data}}
        </tbody>
    </table>
</script>

아래는 문서 준비 중입니다.

var small_source   = $("#small-template").html();
var small_template = Handlebars.compile(small_source);

아래는 json입니다.

var small_data = {
            data: [
                {username: "alan1", firstName: "Alan", lastName: "Johnson", email: "alan1@test.com" },
                {username: "alan2", firstName: "Alan", lastName: "Johnson", email: "alan2@test.com" }
            ]
        };

마지막으로 콘텐츠 홀더에 json을 연결합니다.

$("#small-content-placeholder").html(small_template(small_data));

Eg2 : 각각을 사용하는 반복.

아래 json을 고려하십시오.

var big_data = [
            {
                name: "users1",
                details: [
                    {username: "alan1", firstName: "Alan", lastName: "Johnson", email: "alan@test.com" },
                    {username: "allison1", firstName: "Allison", lastName: "House", email: "allison@test.com" },
                    {username: "ryan1", firstName: "Ryan", lastName: "Carson", email: "ryan@test.com" }
                  ]
            },
            {
                name: "users2",
                details: [
                    {username: "alan2", firstName: "Alan", lastName: "Johnson", email: "alan@test.com" },
                    {username: "allison2", firstName: "Allison", lastName: "House", email: "allison@test.com" },
                    {username: "ryan2", firstName: "Ryan", lastName: "Carson", email: "ryan@test.com" }
                  ]
            }
      ];

콘텐츠 보유자에게 json을 전달하는 동안 다음과 같이 이름을 지정하십시오.

$("#big-content-placeholder").html(big_template({big_data:big_data}));

템플릿은 다음과 같습니다.

<script id="big-template" type="text/x-handlebars-template">
    <table>
        <thead>
            <th>Username</th>
            <th>email</th>
        </thead>
        <tbody>
            {{#each big_data}}
                <tr>
                    <td>{{name}}
                            <ul>
                                {{#details}}
                                    <li>{{username}}</li>
                                    <li>{{email}}</li>
                                {{/details}}
                            </ul>
                    </td>
                    <td>{{email}}</td>
                </tr>
            {{/each}}
        </tbody>
    </table>
</script>

gulp 핸들 바를 사용하여 어떻게 컴파일합니까?
webkitfanz dec.

10

내 말은 template()..

결과를 객체로 전달하기 만하면됩니다. 그래서 전화하는 대신

var html = template(data);

하다

var html = template({apidata: data});

{{#each apidata}}템플릿 코드에서 사용

http://jsfiddle.net/KPCh4/4/의 데모
( 충돌 한 일부 남은 if코드 제거 )


3
좋지만 AZ 답변이 더 좋습니다. 사용 {{#each this}}은 올바른 형식입니다.
emzero 2014 년

실제로이 방법이 훨씬 더 의미가 있습니다. 감사합니다!
woohoo

8

핸들 바는 배열을 컨텍스트로 사용할 수 있습니다. .데이터의 루트로 사용할 수 있습니다 . 따라서 배열 데이터를 {{#each .}}.

var data = [
  {
    Category: "General",
    DocumentList: [
      {
        DocumentName: "Document Name 1 - General",
        DocumentLocation: "Document Location 1 - General"
      },
      {
        DocumentName: "Document Name 2 - General",
        DocumentLocation: "Document Location 2 - General"
      }
    ]
  },
  {
    Category: "Unit Documents",
    DocumentList: [
      {
        DocumentName: "Document Name 1 - Unit Documents",
        DocumentList: "Document Location 1 - Unit Documents"
      }
    ]
  },
  {
    Category: "Minutes"
  }
];

$(function() {
  var source = $("#document-template").html();
  var template = Handlebars.compile(source);
  var html = template(data);
  $('#DocumentResults').html(html);
});
.row {
  border: 1px solid red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0/handlebars.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<div id="DocumentResults">pos</div>
<script id="document-template" type="text/x-handlebars-template">
  <div>
  {{#each .}}
    <div class="row">
      <div class="col-md-12">
        <h2>{{Category}}</h2>
        {{#DocumentList}}
        <p>{{DocumentName}} at {{DocumentLocation}}</p>
        {{/DocumentList}}
      </div>
    </div>
  {{/each}}
  </div>
</script>


1

사용 this하고 {{this}}. node.js의 아래 코드를 참조하십시오.

var Handlebars= require("handlebars");
var randomList= ["James Bond", "Dr. No", "Octopussy", "Goldeneye"];
var source= "<ul>{{#each this}}<li>{{this}}</li>{{/each}}</ul>";
var template= Handlebars.compile(source);
console.log(template(randomList));

콘솔 로그 출력 :

<ul><li>James Bond</li><li>Dr. No</li><li>Octopussy</li><li>Goldeneye</li></ul>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.