我正在尝试使用richfaces extendedDataTable和a4j:support来更改rich:panel的'rendered'属性的值,但它不起作用。
这是我的JSF页面的一部分,其中包含一个rich:extendedDataTable和一个rich:panel:
<h:form id="tabForm">
<rich:extendedDataTable id="myTable" width="500px" height="250px"
value="#{extDataTableBean.extList}" var="dataRow"
selection="#{extDataTableBean.selection}" selectionMode="single">
<rich:column>
<f:facet name="header"><h:outputText value="ID" /></f:facet>
<h:outputText value="#{dataRow.id}"></h:outputText>
</rich:column>
<rich:column>
<f:facet name="header"><h:outputText value="Name" /></f:facet>
<h:outputText value="#{dataRow.name}"></h:outputText>
</rich:column>
<a4j:support id="myTableTakeSelection" action="#{extDataTableBean.takeSelection}" event="onselectionchange" reRender="pane" />
</rich:extendedDataTable>
</h:form>
<rich:panel id="pane" rendered="#{extDataTableBean.showPane}">
<h:form id="secForm">
<h:outputText value="ID : " />
<h:inputText id="inTextID" value="#{extDataTableBean.idFd}" />
<br/>
<h:outputText value="Name : " />
<h:inputText id="inTextName" value="#{extDataTableBean.nameFd}" />
</h:form>
</rich:panel>
rich:panel'graved'属性的默认值为false(在辅助bean中设置)。我想要实现的是当选择extendedDataTable中的一行时,其值将更改为true,以便在GUI中可见。
这是我的支持bean的一部分:
/* Constructor */
public ExtDataTableBean(){
setShowPane(false); // default to false
loadDataList();
}
/* Load some test data into extendedDataTable */
public void loadDataList(){
extList = new ArrayList<MyData>();
MyData e1 = new MyData();
e1.setId(1);
e1.setName("name 1");
extList.add(e1);
MyData e2 = new MyData();
e2.setId(2);
e2.setName("name 2");
extList.add(e2);
}
public String takeSelection(){
Iterator iterator = getSelection().getKeys();
Object key = null;
while(iterator.hasNext()){
key = iterator.next();
}
/* set the values of inputText with value from selected row */
setIdFd(extList.get(Integer.parseInt(key.toString())).getId());
setNameFd(extList.get(Integer.parseInt(key.toString())).getName());
setShowPane(true);
return null;
}
public List<MyData> getExtList() {
/* Lazy loading */
if(extList == null){
loadDataList();
}
return extList;
}
在takeSelection()方法中,我使用setShowPane(true)将rich:panel'graved'属性的值更改为true。问题很丰富:当选择行时,GUI在GUI中不可见。
我做了另一个简单的测试,添加了一个h:commandButton和a4j:support来将showPane设置为true,如下所示:
<h:commandButton id="cmdBtn" value="Show Pane">
<a4j:support id="cmdBtnSupport" reRender="pane" action="#{extDataTableBean.dispPane}" event="onclick" />
</h:commandButton>
并在支持bean中:
public String dispPane(){
setShowPane(true);
return null;
}
它按预期工作。 rich:单击按钮后,GUI中的面板可见。
我的代码中遗漏了什么?
答案 0 :(得分:3)
我想我从这个网站找到了问题的原因: http://community.jboss.org/wiki/CommonAjaxRequestsProblems#conditionalRendering
描述问题的部分的摘录:
客户端更新:
reRender属性不应该指向有条件渲染的元素,因为框架不知道在哪里添加之前不在DOM中的元素。这些组件的父母应该被重新承认。
因此,在我修改了要重新渲染的部件并将其绑定到如下之后,它现在正在运行:
<rich:panel id="pane" >
<h:form id="secForm" rendered="#{extDataTableBean.showPane}" >
<h:outputText value="ID : " />
<h:inputText id="inTextID" value="#{extDataTableBean.idFd}" />
<br/>
<h:outputText value="Name : " />
<h:inputText id="inTextName" value="#{extDataTableBean.nameFd}" />
</h:form>
</rich:panel>
答案 1 :(得分:0)
<rich:extendedDataTable>
是开箱即用的Ajax。无需添加<a4j:support>
标记,该标记旨在为非ajax JSF组件(例如<h:inputText>
)提供ajax功能。
所以,试试这个:
<rich:extendedDataTable onselectionchange="#{extDataTableBean.takeSelection}">
祝你好运。