Вложенные циклы с не вложенными массивами в handlebars.net - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь создать шаблон руля для тепловой карты по дням в диапазоне от 15 дней до текущего и до 60 дней в будущем.

Вот модель, которую я использую для своего шаблона

public class HeatMapDto
{
    public IEnumerable<HeatMapDateDto> HeatMapDates { get; set; }

    public IEnumerable<ProductDto> Products { get; set; }
}

Вот соответствующий фрагмент моего шаблона

<table style='width: 2000px'>
    <tr>
        <th style='width: 100px'>Product</th>
        <th style='width: 100px'>EAStart</th>
        <th style='width: 100px'>Release</th>
        {{#each HeatMapDates}}
        <th style='width: 50px'>{{FormattedDate}}</th>
        {{/each}}
    </tr>
    {{#each Products}}
    <tr>
        <td>{{ProductName}}</td>
        <td>{{FormattedEarlyAccessStart}}</td>
        <td>{{FormattedReleaseDate}}</td>
        {{#each @root.HeatMapDates}}
        <td style="background-color:{{SelectCellColor DateValue EarlyAccessDate ReleaseDate '#747dff' '3d07ff' '#8cb871' '#e9fbff'}}{{/SelectCellColor}}">&nbsp;</td>
        {{/each}}
    </tr>
    {{/each}}
</table>

HeatMapDates заполнен всеми днями для отчета, и я могу перебрать их, чтобы сгенерировать заголовки столбцов.

public class HeatMapDateDto
{
    public DateTime DateValue { get; set; }

    public string FormattedDate => DateValue.ToString("MM/dd");
}

public class HeatMapProductDto
{
    public string ProductName { get; set; }

    public DateTime? EarlyAccessStart { get; set; }

    public DateTime? ReleaseDate { get; set; }

    public string FormattedEarlyAccessStart => EarlyAccessStart?.ToString("MM/dd");

    public string FormattedReleaseDate => ReleaseDate?.ToString("MM/dd");
}

SelectCellColor - это обработчик, который я зарегистрировал в своем коде, и когда он вызывается, три даты не определены, а контекст равен HeatMapDate.Его цель состоит в том, чтобы определить, какой из 4 цветов передается для применения к ячейке: InEarlyAcccess, ReleaseDate, PostRelease или цвет по умолчанию, в этом порядке.

, если я выполняю внешний цикл, подобный этому {{#each product in Products}},Handlebars.Net выдает исключение:

System.AggregateException: произошла одна или несколько ошибок.---> System.InvalidOperationException: последовательность содержит более одного элемента

Есть идеи о том, как заставить эту работу выполнять итерацию по двум массивам, когда они не являются parent-child?

1 Ответ

0 голосов
/ 25 июня 2018

Handlebars не поддерживает синтаксис variableName in, только синтаксис #each enumerable.

Вы все еще можете использовать вложенные циклы - каждый блок создает новый контекст, а родительский контекст всегда доступен через ../.Так что в вашем случае во внешнем цикле this (или просто неявный контекст) будет текущий элемент, а во вложенном цикле ../ будет ссылаться на текущий элемент во внешнем цикле.

...