Primefaces dataTable中的InputText不刷新
当表单处于可编辑模式时,需要在primefaces数据表中包含inputTexts。Primefaces dataTable中的InputText不刷新
除了使用immediate =“true”(没有表单验证)的表单清理以外,一切正常。那么primefaces数据表的行为是不可预测的。用新数据填写数据表后,它仍然保存旧值。
短的例子 - 显示h的差异:DataTable,并将号码: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>
和java:
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.号码:dataTable中具有p:inputText的 2. H:dataTable中具有p:0的inputText3.号码:dataTable中与H:的outputText
和2个按钮:首先清除数据,第二数据应用
工作流程:
尝试更改中的p inputTexts数据:dataTable中和h :dataTable的
列表清除数据(字符串的ArrayList) - 点击“清除”按钮(想象一下,你点击取消形式,因为你不想来存储数据到数据库)
加载新的数据 - 点击“更新”按钮(想象一下,你是开扩新数据的新形式)
问: 为什么号码:dataTable中与号码:inputText的还是卖场手动更改数据,不是装载的? 有没有办法强制p:dataTable的行为像h:dataTable在这种情况下?
解决的办法是:primefaces resetInput
在我的例子将是:
<p:commandButton value="Clear" actionListener="#{test.clear()}" immediate="true"
update=":form:testTable :form:testTable1 :form:testTable2">
<p:resetInput target=":form:testTable" />
</p:commandButton>
编辑: 在某些情况下 - 如果上面是行不通的 - 试图从primefaces扩展的一个:
<pe:resetInput for=":form:testTable" />
您遇到的问题是提交表单时,将为绑定到此列表中的每个数据表(或<h>
)提交#{test.list}
值。换句话说:
JSF将
testTable
DataTable的值绑定到你的#{test.list}
。JSF将把数据表
testTable1
的值绑定到#{test.list}
。这些值将取代从testTable
数据表绑定的值,并且数据将丢失。#{test.list}
将包含testTable1
中的数据。JSF将把
testTable2
数据表的值绑定到#{test.list}
。由于这里的 值是旧值,这些值将被提交#{test.list}
。
解决这个问题的最好办法是使用单个<p:dataTable>
(或<h>
,根据您的需要),并在您的托管bean,如果你的表是在查看或编辑模式控制的属性。
JSF代码
<h:form id="form">
<p:dataTable var="v" value="#{test.list}" id="testTable">
<p:column headerText="Test value">
<h:outputText value="#{v}" rendered="#{not test.editMode}" />
<p:inputText value="#{v}" rendered="#{test.editMode}" />
</p:column>
</p:dataTable>
<p:commandButton value="Clear" actionListener="#{test.clear()}" immediate="true"
update="testTable" />
<p:commandButton value="Update" actionListener="#{test.update()}"
update="testTable" />
<!-- adding a new button just for testing purposes -->
<p:commandButton value="Submit list" action="#{test.submit}" />
</h:form>
Managed Bean的代码
//no need of CDI
@ManagedBean
@ViewScoped
public class Test implements Serializable {
private List<String> list;
private boolean editMode = false;
public Test() {
}
@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");
}
//method for testing purposes
public void submit() {
//in real life web apps, you should log the messages, don't use System.out
System.out.println("Showing actual values of list attribute.");
for(String s : list) {
System.out.println(s);
}
}
}
感谢Luiggi,但正如你说这是不是。我发布了这三个表来显示p:dataTable和h:dataTable的行为差异。但在我的例子中只列出了其中的一个表。 p:dataTable仍然会像我描述的那样工作,因为我不喜欢,而h:dataTable会像我喜欢的那样工作。你能告诉我为什么p:dataTable从bean中清除绑定的空列表(清理后),并且在新列表生成并更新p:dataTable之后,手动更改但不是绑定列表。它会记住在bean清单清理之前手动创建的值。 – robson