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.