จะวนซ้ำอาร์เรย์ของวัตถุใน Handlebars ได้อย่างไร


109

นี่อาจจะดูเป็นคำถามโง่ ๆ แต่ดูเหมือนฉันจะหาคำตอบไม่ได้จากที่ไหน

ฉันกดปุ่ม Web API นี้ที่ส่งคืนอาร์เรย์ของวัตถุในรูปแบบ JSON:

อาร์เรย์ของวัตถุ

เอกสาร 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

คำตอบ:


158

คุณสามารถผ่านthisไปยังแต่ละบล็อก ดูที่นี่: http://jsfiddle.net/yR7TZ/1/

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

แล้วเรียกเลขดัชนีของวงนอก{{#each people}}ในวงในได้{{#each this}}หรือไม่? Like{{people@index}}
RegarBoy

19

ซอนี้มีทั้งeachjson โดยตรง http://jsfiddle.net/streethawk707/a9ssja22/

ด้านล่างนี้เป็นสองวิธีในการทำซ้ำบนอาร์เรย์ หนึ่งคือการส่งผ่าน json โดยตรงและอีกอันกำลังตั้งชื่ออาร์เรย์ json ในขณะที่ส่งไปยังตัวยึดเนื้อหา

Eg1: ตัวอย่างด้านล่างเรียกโดยตรง json key (data) ภายในตัวแปร small_data

ใน 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>

เรารวบรวมสิ่งนี้โดยใช้มือจับอึกได้อย่างไร?
webkitfanz

10

ฉันหมายถึงการtemplate()โทร ..

คุณเพียงแค่ต้องส่งผลลัพธ์เป็นวัตถุ ดังนั้นแทนที่จะโทร

var html = template(data);

ทำ

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

และใช้ {{#each apidata}}ในรหัสเทมเพลตของคุณ

สาธิตที่http://jsfiddle.net/KPCh4/4/
( ลบifโค้ดที่เหลือบางส่วนที่ขัดข้อง )


3
ดี แต่คำตอบ AZ ดีกว่า ใช้{{#each this}}เป็นรูปแบบที่ถูกต้อง
emzero

แน่นอนวิธีนี้สมเหตุสมผลกว่ามากขอบคุณ!
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>

0

ฉันมีปัญหาที่คล้ายกันฉันได้รับวัตถุทั้งหมดthisแต่ค่ากำลังแสดงในขณะที่ทำ#eachแต่ค่าที่ถูกแสดงในขณะที่ทำ

วิธีแก้ไข: ฉันจัดโครงสร้างอาร์เรย์ของวัตถุใหม่เช่นนี้:

let list = results.map((item)=>{
    return { name:item.name, author:item.author }
});

จากนั้นในไฟล์เทมเพลต:

{{#each list}}
    <tr>
        <td>{{name }}</td>
        <td>{{author}}</td>      
    </tr>
{{/each}} 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.