|
|
|
Помогите разобраться с рендерингом Ajax в JSF 1
|
|||
|---|---|---|---|
|
#18+
Добрый день. Столкнулся с нежеланием Ajax перерисовывать HTML форму, при определённых условиях, помогите советом. Суть задачи: На форме должен быть выпадающий список с кнопкой добавления, при её нажатии в форме должен появляться ещё один такой же выпадающий список. Опыт разработки на Java EE да и вообще web у меня не богат (основная разработка на СУБД ORACLE), поэтому я пользовался материалами с этих источников: http://qaru.site/questions/8103/how-to-dynamically-add-jsf-components http://qaru.site/questions/5932/how-to-create-dynamic-jsf-form-fields http://qaru.site/questions/8104/how-to-implement-a-dynamic-list-with-a-jsf-20-composite-component https://www.ibm.com/developerworks/ru/library/wa-aj-jsfcss1/index.html Был выбран вариант с h:dataTable, но кнопка в данном случае сабмитит форму, а этого мне не надо. Дальше попытка подключить ajax и тут я немного продвинулся не без помощи этой инфы: http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/f/ajax.html http://www.sql.ru/forum/1145487/h-commandbutton-f-ajax-jsf http://www.sql.ru/forum/899664/jsf-ajax-neprostoy-sluchay https://stackoverflow.com/questions/7956117/how-to-pass-an-iterated-parameter-via-ajax-to-a-backing-bean-method В общем что я наваял. Сначала класс, содержащий значения для выпадающего списка в котором есть ИД, имя и код DictGenerationAttr public class DictGenerationAttr extends AbstractDictionary { private String showValue; public DictGenerationAttr(Long id, String code, String name) { super(id, code, name); showValue = id + " - " + name; } public String getShowValue() { return showValue; } public void setShowValue(String showValue) { this.showValue = showValue; } } Заполняется он из БД в классе DictionaryDao , не буду приводит этот код. Там всё работает, значения заносятся в List. Затем создаётся класс GenAttrList, одной из переменной которого является List из DictGenerationAttr package model; import java.io.Serializable; import DictionaryDao; public class GenAttrList implements Serializable { private Long id; private DictGenerationAttr[] genAttrValues; private Long genAttrValue; public GenAttrList(Long id, Long genAttrValue){ final DictionaryDao dictionaryDao = DictionaryDao.getInstance(); genAttrValues = dictionaryDao.getDictTaskGenAttr().toArray(new DictGenerationAttr[dictionaryDao.getDictTaskGenAttr().size()]); this.id = id; this.genAttrValue = genAttrValue; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public DictGenerationAttr[] getGenAttrValues() { return genAttrValues; } public void setGenAttrValues(DictGenerationAttr[] genAttrValues) { this.genAttrValues = genAttrValues; } public Long getGenAttrValue() { return genAttrValue; } public void setGenAttrValue(Long genAttrValue) { this.genAttrValue = genAttrValue; } } Здесь id - для хранения индекса массива, genAttrValue задумывалось для хранения выбранного значения из выпадающего списка. Затем создаётся List из объектов GenAttrList в большом классе: public class Task extends Utils implements Serializable { ....... private ArrayList<GenAttrList> genAttrList; public List<GenAttrList> getGenAttrList () { genAttrList = new ArrayList<GenAttrList>(); genAttrList.add(new GenAttrList((long) (genAttrList.size()), null)); return genAttrList; } ....... и добавление в массив нового элемента public void addGenAttr(){ genAttrList.add(new GenAttrList((long) (genAttrList.size()), null)); } Всё коряво, так как делается, что называется, по методу проб и ошибок. Класс Task в итоге импортируется в ManagedBean taskDetails. И в конце концов форма: <ui:composition> <h:form id="form" role="form" styleClass="form-horizontal" method="post" enctype="multipart/form-data"> ..... <div class="form-group"> <h:outputLabel value="#{msg['task.genAttr']}" for="genAttr" class="col-sm-3 control-label"/> <div class="col-sm-6"> <h:dataTable id="genAttrBlock" value="#{taskDetails.task.genAttrList}" var="attribute"> <h:column> <h:selectOneListbox id="taskGenAttr" value="#{attribute.genAttrValue}" size="1" styleClass="form-control"> <f:selectItem itemLabel="---" itemValue="#{null}" noSelectionOption="true" /> <f:selectItems value="#{attribute.genAttrValues}" var="taskGenAttr" itemValue="#{taskGenAttr.id}" itemLabel="#{taskGenAttr.showValue}"/> <f:ajax execute="@this"/> </h:selectOneListbox> </h:column> <h:column> <h:inputText for="genattrnum" value="#{taskDetails.task.genAttrList.size()}" class="col-md-3 control-label"/> </h:column> </h:dataTable> <h:commandButton value="add"> <f:ajax event="click" render=" genAttrBlock " listener=" #{taskDetails.task.addGenAttr()} " execute="@this"/> </h:commandButton> </div> </div> В итоге на форме создаётся таблица с заполненным выпадающим списком в одной ячейке, часть целей задачи достигнуто, при нажатии на кнопку добавляется элемент в getGenAttrList, это дебаг показал, но на форме новый выпадающий список не появляется. Подскажите, как заставить ajax зарендерить всю таблицу с новыми выпадающими списками. В качестве эксперимента вешал на ajax на h:inputText genattrnum, который находится внутри таблицы, изменения его значения проходили без проблем, но он то уже отображался в отличии от нового выпадающего списка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2017, 03:42 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=63&tid=2122726]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 396ms |

| 0 / 0 |
