Как перебирать массив объектов в руле?
это может показаться глупым вопросом, но я не могу найти ответ нигде.
Я нажимаю этот веб-Api, который возвращает массив объектов в формате JSON:

Handlebars docs показывает следующий пример:
<ul class="people_list">
{{#each people}}
<li>{{this}}</li>
{{/each}}
</ul>
в контексте:
{
people: [
"Yehuda Katz",
"Alan Johnson",
"Charles Jolley"
]
}
в моем случае у меня нет имени для массива, это просто корневой объект ответа. Я пробовал использовать {{#each}} не повезло.
первый время с помощью руля... чего мне не хватает?
обновление
вот упрощенная скрипка, чтобы показать, что я прошу:http://jsfiddle.net/KPCh4/2/
требует ли handlebars, чтобы контекстная переменная была объектом, а не массивом?
5 ответов:
Вы можете пройти
thisдля каждого блока. Смотрите здесь: http://jsfiddle.net/yR7TZ/1/{{#each this}} <div class="row"></div> {{/each}}
эта скрипка имеет как
eachи прямой json. http://jsfiddle.net/streethawk707/a9ssja22/.Ниже приведены два способа итерации по массиву. Один из них-с прямой передачей json, а другой-с именем массива json при передаче владельцу контента.
Eg1: приведенный ниже пример непосредственно вызывает ключ json (данные) внутри переменной 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: "[email protected]" }, {username: "alan2", firstName: "Alan", lastName: "Johnson", email: "[email protected]" } ] };наконец прикрепите json к держателю контента:
$("#small-content-placeholder").html(small_template(small_data));Eg2: итерация с использованием каждого.
рассмотрим ниже json.
var big_data = [ { name: "users1", details: [ {username: "alan1", firstName: "Alan", lastName: "Johnson", email: "[email protected]" }, {username: "allison1", firstName: "Allison", lastName: "House", email: "[email protected]" }, {username: "ryan1", firstName: "Ryan", lastName: "Carson", email: "[email protected]" } ] }, { name: "users2", details: [ {username: "alan2", firstName: "Alan", lastName: "Johnson", email: "[email protected]" }, {username: "allison2", firstName: "Allison", lastName: "House", email: "[email protected]" }, {username: "ryan2", firstName: "Ryan", lastName: "Carson", email: "[email protected]" } ] } ];при передаче 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>
Я имел в виду в
template()звонок..вам просто нужно передать результаты в качестве объекта. Так что вместо вызова
var html = template(data);do
var html = template({apidata: data});и использовать
{{#each apidata}}в шаблоне коддемо на http://jsfiddle.net/KPCh4/4/
(удалены остаткиifкод, который разбился)
руль может использовать массив в качестве контекста. Вы можете использовать
.как корень данных. Таким образом, вы можете перебирать данные массива с помощью{{#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>
используя
thisи{{this}}. См. код ниже в узле.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>
Comments