Метеор и руль # каждый, чтобы перебрать объект
Я хочу использовать handlebars #each
с объектом, а не массивом.
Как мне это сделать? Мне нужно, чтобы он все еще работал со специальными функциями метеорита с #each
.
Мой объект находится в форме:
{
john: "hello",
bob: "hi there"
}
Я пытаюсь получить такой вывод:
<div>hello</div>
<div>hi there</div>
Ответы
Ответ 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;
});