(в данном примере мы используем primefaces компоненту, но вопрос не связан с Primefaces)JSF композита - Аякс поведение для итерационных элементов
Введения:
Для того, чтобы иметь АЯКС поддержки составных элементов компонентов мы просто используем элемент:
- композиционный: clientBehavior
Давайте посмотрим на эту ситуацию:
<composite:interface>
<composite:clientBehavior name="dateSelect" event="dateSelect" targets="id111 id222" />
</composite:interface>
<composite:implementation>
<p:calendar id="id111" value="#{csController.selectedDate}" mode="inline"
mindate="#{csController.minDate(2013,9)}"
maxdate="#{csController.maxDate(2013,9)}"/>
<p:calendar id="id222" value="#{csController.selectedDate}" mode="inline"
mindate="#{csController.minDate(2013,10)}"
maxdate="#{csController.maxDate(2013,10)}"/>
</composite:implementation>
Мы имеем два элемента и поддержку Ajax для этих двух элементов. Это работает так, как ожидалось. Мы могли бы даже изменить на этот интерфейс:
<composite:interface>
<composite:clientBehavior name="dateSelect" event="dateSelect" targets="id111" />
<composite:clientBehavior name="dateSelect" event="dateSelect" targets="id222" />
</composite:interface>
и это все еще работает отлично.
Проблема:
Я хотел бы изменить реализацию, чтобы показать произвольное число календарей, не exaclty два, как показано выше. Поэтому я пробовал это:
<composite:interface>
<composite:attribute name="firstMonth" default="1"/>
<composite:attribute name="lastMonth" default="12"/>
<c:forEach var="i" begin="#{cc.attrs.firstMonth}" end="#{cc.attrs.lastMonth}">
<composite:clientBehavior name="dateSelect" event="dateSelect" targets="#{cc.clientId}#{i}"/>
</c:forEach>
</composite:interface>
<composite:implementation>
<c:forEach var="i" begin="#{cc.attrs.firstMonth}" end="#{cc.attrs.lastMonth}">
<p:calendar id="#{cc.clientId}#{i}" value="#{csController.selectedDate}" mode="inline"
mindate="#{csController.minDate(2013,i)}"
maxdate="#{csController.maxDate(2013,i)}"/>
</c:forEach>
</composite:implementation>
Это, конечно, не работает.
Вопрос:
Как получить поддержку AJAX для всех элементов, порождаемых с: Foreach цикл?
И если мы хотим, чтобы добавить больше атрибутов в ajax, мы должны отредактировать составной компонент, например добавив 'onchange' (говорящий в общем случае, не особенно календарь). решение здесь очень специфично, я думаю, было бы неплохо создать clientBehavior «на лету». Я устал, используя тот же пример в вопросе, основная проблема заключается в том, что теги реализации (например, календари) не имеют предварительно оцененных идентификаторов, это не сработает! –
@HatemAlimam, это хороший момент. Я собираюсь обновить свой ответ, я не думаю, что можно добавить ajax-поведение «на лету» на пути, который предлагает OP. Однако то, что уже кажется решением, состоит в том, чтобы иметь набор возможных событий ajax behavioured и определять, какие из них использовать и их слушатели на интерфейсе. –
@ Xtreme Biker. Похоже, вы правы и добавляете ajax-поведение «на лету» в невозможно. По крайней мере, невозможно, если на основе входных атрибутов. Но ваше второе решение выглядит просто отлично. Я сделаю это так. Спасибо. – Hubert