Подтвердить что ты не робот

Метеор и руль # каждый, чтобы перебрать объект

Я хочу использовать handlebars #each с объектом, а не массивом.

Как мне это сделать? Мне нужно, чтобы он все еще работал со специальными функциями метеорита с #each.

Мой объект находится в форме:

{
  john: "hello",
  bob: "hi there"
}

Я пытаюсь получить такой вывод:

<div>hello</div>
<div>hi there</div>
4b9b3361

Ответ 1

Вам нужно использовать помощник в js, чтобы помочь дескрипторам понять ваш объект:

Добавьте к вашему клиенту js

Template.registerHelper('arrayify',function(obj){
    var result = [];
    for (var key in obj) result.push({name:key,value:obj[key]});
    return result;
});

И используйте (вы также можете использовать ключ с {{name}}) в своем html:

{{#each arrayify myobject}}
   <div title="hover here {{name}}">{{value}}</div>
{{/each}}

myobject поступает из вашего шаблона:

Template.templatename.helpers({
    myobject : function() { 
      return { john:"hello", bob: "hi there" } 
    }
});

Ответ 2

Вы можете преобразовать свой объект в массив с подчеркиванием _.map

HTML:

<template name="test">
    {{#each person}}
       <div>{{greeting}}</div>
    {{/each}}
</template>

JS:

Template.test.helpers({
    person : function () { 
        return _.map(object, function(val,key){return {name: key, greeting: val}});
    }
});

Ответ 3

Следует отметить, что люди теперь находят это сейчас, когда правильный способ объявить помощники Handlebars в Meteor на момент написания этой статьи - это метод UI.registerHelper, а не Handlebars.registerHelper. Таким образом, вышеприведенный помощник должен выглядеть следующим образом:

UI.registerHelper("arrayify", function(obj){
    result = [];
    for (var key in obj){
        result.push({name:key,value:obj[key]});
    }
    return result;
});