Доступ к массиву рулевых плат с динамическим индексом

Как я могу получить доступ к элементу массива внутри шаблона 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}}