Доступ к массиву рулевых плат с динамическим индексом
Как я могу получить доступ к элементу массива внутри шаблона handlebars, используя переменную вместо жестко заданного значения?
Мне нужно сделать что-то вроде:
{{#each condition in conditions}}
{{App.ops.[condition.op].name}}
{{/each}}
на данный момент не дает мне ошибку синтаксического анализа, но во время выполнения ничего мне не возвращает.
Если я сделаю что-то вроде этого:
{{App.ops.[1].name}}
он работает, но это не то, что я ищу
Ответы
Ответ 1
Относится к моему ответу на другой вопрос
Вы можете использовать встроенный помощник lookup
:
Помощник lookup
позволяет изменять динамическое значение параметра с помощью переменных Handlebars. Это полезно для определения значений для индексов массива.
Используя lookup
, ваш пример можно записать как
{{#each condition in conditions}}
{{#with (lookup ../App.ops condition.op)}}
{{name}}
{{/with}}
{{/each}}
(Обратите внимание, что без знания структуры ваших данных я делаю предположение о местоположении App.ops
.)
Ответ 2
Вы можете написать простой помощник, чтобы получить значение из массива
Handlebars.registerHelper('getmyvalue', function(outer, inner) {
return outer[inner.label];
});
а затем используйте его в шаблоне, например
{{#each outer}}
{{#each ../inner}}
{{getmyvalue ../this this }}
{{/each}}
../this
ссылки на текущий внешний элемент и this
- на текущий внутренний элемент
Пример данных, поступающих в шаблон:
{
outer: {
1: { foo: "foo value" },
2: { bar: "bar value" }
},
inner: {
1: { label: "foo" },
2: { label: "bar" }
}
}
Ответ 3
Вам нужно создать помощника для вашей проблемы. Ниже приведен образец решения вашей проблемы с использованием значений индекса. Если вы хотите использовать некоторые условия, вы также можете это сделать.
Handlebars.registerHelper("each_with_index", function(array, options) {
if(array != undefined && array != null && array.length > 0){
var html = new StringBuffer();
for (var i = 0, j = array.length; i < j; i++) {
var item = array[i];
item.index = i+1;
// show the inside of the block
html.append(options.fn(item));
}
// return the finished buffer
return html.toString();
}
return "";
});
Затем вы можете сделать что-то вроде этого
{{#each_with_index condition in conditions}}
{{App.ops.[condition.index].name}}
{{/each_with_index}}