代码之家  ›  专栏  ›  技术社区  ›  empz

如何迭代Handlebars中的对象数组?

  •  135
  • empz  · 技术社区  · 12 年前

    这可能看起来是个愚蠢的问题,但我似乎在任何地方都找不到答案。

    我正在使用这个Web API,它以JSON格式返回一个对象数组:

    array of objects

    Handlebars文档显示了以下示例:

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

    在以下情况下:

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

    在我的例子中,我没有数组的名称,它只是响应的根对象。我试过使用 {{#each}} 没有运气。

    第一次使用Handlebars。。。我错过了什么?

    更新

    下面是一个简化的小提琴,向您展示我的要求: http://jsfiddle.net/KPCh4/2/

    handles是否要求上下文变量是对象而不是数组?

    6 回复  |  直到 6 年前
        1
  •  192
  •   Liam Joshua    7 年前

    你可以通过 this 到每个块。请参见此处: http://jsfiddle.net/yR7TZ/1/

    {{#each this}}
        <div class="row"></div>
    {{/each}}
    
        2
  •  31
  •   Liam Joshua    7 年前

    这把小提琴兼有这两者 each 和直接json。 http://jsfiddle.net/streethawk707/a9ssja22/ .

    下面是迭代数组的两种方法。一种是直接json传递,另一种是在传递给内容持有者时命名json数组。

    Eg1:下面的示例直接调用small_data变量中的json键(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>
    
        3
  •  12
  •   Liam Joshua    7 年前

    我的意思是 template() 呼叫

    您只需要将结果作为对象传递。所以不要打电话

    var html = template(data);
    

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

    和使用 {{#each apidata}} 在模板代码中

    演示时间: http://jsfiddle.net/KPCh4/4/
    ( 去掉了一些剩菜 if 崩溃的代码 )

        4
  •  9
  •   Liam Joshua    7 年前

    Handlebars可以使用数组作为上下文。您可以使用 . 作为数据的根。因此,您可以使用 {{#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>
        5
  •  8
  •   Hardik Raval    5 年前

    我有一个类似的问题,我把整个物体都放进去了 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}} 
    
        6
  •  3
  •   Liam Joshua    7 年前

    使用 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>
    
    推荐文章