如果我运行该应用并点击第一个p:commandLink
,item
将按预期设置。单击另一个p:commandLink
时,前一个将被删除(null)。 h:commandLink
没有这个问题。
如果我将:theform:output
添加到update
的{{1}}参数,之前点击的项目就会停止消失。
这种行为的原因是什么?
的Env
的index.xhtml
p:commandLink
XtestListBean.java
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:form id="theform">
<h:panelGroup layout="block" styleClass="tableBorder" id="tableWrapper">
<h:dataTable value="#{xtestListBean.list}" var="item">
<h:column>
<h:outputText value="#" styleClass="tableItem" />
</h:column>
<h:column>
<h:commandLink
value="#{item.name}"
actionListener="#{xtestEntityBean.setItem(item)}">
<f:ajax render=":theform:tableWrapper" />
</h:commandLink>
<p:commandLink
value="#{item.name}"
actionListener="#{xtestEntityBean.setItem(item)}"
update=":theform:tableWrapper">
</p:commandLink>
</h:column>
</h:dataTable>
</h:panelGroup>
<h:inputText value="#{xtestEntityBean.item.name}" size="40" id="output" />
</h:form>
</h:body>
</html>
XtestEntityBean.java
package beans;
import dto.Item;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class XtestListBean implements Serializable {
private List<Item> list;
public XtestListBean() {
list = new ArrayList();
list.add(new Item("Test 1"));
list.add(new Item("Test 2"));
list.add(new Item("Test 3"));
list.add(new Item("Test 4"));
list.add(new Item("Test 5"));
list.add(new Item("Test 6"));
list.add(new Item("Test 7"));
}
public List<Item> getList() {
return list;
}
}
答案 0 :(得分:1)
只是这样。只是在调用<h:inputText value="#{xtestEntityBean.item.name}">
时也会处理<p:commandLink>
。在效果中,项目的name
以空/空值提交,并反映在表格中。这不是整个Item
实例变为null
左右。
这是怎么造成的?好吧,<f:ajax execute>
默认为@this
,这意味着在表单提交期间只处理当前组件(即命令链接)。但是,PrimeFaces等效,<p:commandLink process>
默认为@form
,这意味着在表单提交期间处理整个父表单,包括引用项目名称的空输入字段。
如果您明确将<p:commandLink process>
设置为@this
,与<f:ajax execute>
的默认设置相同,那么它应该按预期工作。
<p:commandLink
value="#{item.name}"
actionListener="#{xtestEntityBean.setItem(item)}"
process="@this" update=":theform:tableWrapper">
</p:commandLink>