Acceleo: динамически генерировать HTML-сетку в цикле for

Я использую Acceleo 3.0 для генерации HTML-кода из модели EMF. У меня есть следующий код:

<div class="ui-grid" style="text-align:center">
    [for ( icon : Icon | self.Icons )]
            <div class="column-a"><button data-icon="[iconName/]"></button></div>
            <div class="column-b"><button data-icon="[iconName/]"></button></div>
            <div class="column-c"><button data-icon="[iconName/]"></button></div>
    [/for]
</div>

Теперь, что я хотел бы сделать, это сделать его полностью параметрическим, постепенно применяя имена классов в цикле for, пока я не достигну параметра MaxColumns в моей модели, затем начиная с 0. То есть, если у меня MaxColumns = 3, я бы хотел следующий результат:

<div class="ui-grid" style="text-align:center">
  <div class="column-a"><button data-icon="icon-1"></button></div>
  <div class="column-b"><button data-icon="icon-2"></button></div>
  <div class="column-c"><button data-icon="icon-3"></button></div>
  <div class="column-a"><button data-icon="icon-4"></button></div>
  <div class="column-b"><button data-icon="icon-5"></button></div>
  <div class="column-c"><button data-icon="icon-6"></button></div>
  <div class="column-a"><button data-icon="icon-7"></button></div>
  <div class="column-b"><button data-icon="icon-8"></button></div>
  <div class="column-c"><button data-icon="icon-9"></button></div>
  ...
</div>

Заранее спасибо.

1 ответ

Решение

Предположим, ваш MaxColumn атрибут связан self (в контексте, который вы описываете), вы можете использовать subSequence(start, end) оператор на Icons если эта ссылка является последовательностью. Вот код:

<div class="ui-grid" style="text-align:center">
[for ( icon : Icon | self.Icons->subSequence(1, self.MaxAttribute) )]
        <div class="column-a"><button data-icon="[iconName/]"></button></div>
        <div class="column-b"><button data-icon="[iconName/]"></button></div>
        <div class="column-c"><button data-icon="[iconName/]"></button></div>
[/for]

Если ваша ссылка не является последовательностью (но упорядочена, то есть OrderedSet):

<div class="ui-grid" style="text-align:center">
[for ( icon : Icon | self.Icons->asSequence()->subSequence(1, self.MaxAttribute) )]
        <div class="column-a"><button data-icon="[iconName/]"></button></div>
        <div class="column-b"><button data-icon="[iconName/]"></button></div>
        <div class="column-c"><button data-icon="[iconName/]"></button></div>
[/for]

Однако имейте в виду, что если ваш реф. не заказано, Acceleo может собирать элементы коллекции в различном порядке для каждого выполнения. Использование asSequence() не изменит ничего.

Кроме того, будьте осторожны, первый индекс коллекции равен 1, а не 0.

Другие вопросы по тегам