Мне нужно, чтобы inputTexts внутри первичных данных были доступны, когда форма находится в редактируемом режиме.
Все работает правильно, кроме очистки формы с немедленной = "true" (без проверки формы). Тогда данные простых граней ведут себя непредсказуемо. После заполнения datatable новыми данными - он все равно хранит старые значения.
Короткий пример — чтобы показать различия между h:dataTable и p:dataTable — но это работает так же, когда есть только одна из трех таблиц из примера: test.xhtml
<h:body>
<h:form id="form">
<p:dataTable var="v" value="#{test.list}" id="testTable">
<p:column headerText="Test value">
<p:inputText value="#{v}"/>
</p:column>
</p:dataTable>
<h:dataTable var="v" value="#{test.list}" id="testTable1">
<h:column>
<f:facet name="header">
<h:outputText value="Test value" />
</f:facet>
<p:inputText value="#{v}" />
</h:column>
</h:dataTable>
<p:dataTable var="v" value="#{test.list}" id="testTable2">
<p:column headerText="Test value">
<h:outputText value="#{v}" />
</p:column>
</p:dataTable>
<p:commandButton value="Clear" actionListener="#{test.clear()}" immediate="true" update=":form:testTable :form:testTable1 :form:testTable2"/>
<p:commandButton value="Update" actionListener="#{test.update()}" update=":form:testTable :form:testTable1 :form:testTable2"/>
</h:form>
</h:body>
И джава:
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@ViewScoped
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private List<String> list;
@PostConstruct
private void init(){
update();
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public void clear() {
list = new ArrayList<String>();
}
public void update() {
list = new ArrayList<String>();
list.add("Item 1");
list.add("Item 2");
}
}
В приведенном выше примере у меня есть 3 конфигурации: 1. p:dataTable с p:inputText 2. h:dataTable с p:inputText 3. p:dataTable с h:outputText
И 2 кнопки: первая очищает данные, вторая применяет данные
Рабочий процесс:
Попробуйте изменить данные в inputTexts в p:dataTable и h:dataTable
Очистить данные списка (arrayList of string) - нажмите кнопку «очистить» (представьте, что вы нажимаете «Отмена» в форме, потому что не хотите сохранять данные в базе данных)
Загрузить новые данные - нажмите кнопку "обновить" (представьте, что вы открываете новую форму с новыми данными)
Вопрос: Почему p:dataTable с p:inputText по-прежнему хранит измененные вручную данные, а не загруженные? Есть ли способ заставить p: dataTable вести себя как h: dataTable в этом случае?