我内部有一个对话框<p:dialog id="vpmopopup">
,我有一个<h:form id="vpmoForm">
表单,里面有一个数据表<p:dataTable id="reqTypeDtbl">
,在这个数据表中,我有<h:selectOneMenu>
和{{1>}位于同一行的单独列中。
我需要根据调用的<h:inputText >
ajax事件呈现<h:inputText >
,我在后台bean中设置一些值,以在数据表中的特定行中呈现<h:selectOneMenu>
。
我还可以选择添加行,并且当我在seconde行中添加了两行时,我正在更改调用其Ajax方法的<h:inputText >
的值,而后者应该更新{{1来自支持bean。
我尝试了很多解决方法,但似乎没什么用。
这是我试过的解决方法
用户界面中的Ajax调用:
<h:selectOneMenu>
Bean中的Ajax实现:
<h:inputText >
呈现<p:dataTable id="reqTypeDtbl" scrollable="true" scrollHeight="150"
value="#{systemDetailsBean.vpmoReqDetailslsList}"
rowIndexVar="index" var="vpmoReqDtlRow"
rowKey="#{vpmoReqDtlRow.reqTypeName}">
<h:selectOneMenu>
<f:selectItems value="#{systemDetailsBean.vpmoTSSList}"
var="tss" itemLabel="#{tss.label}" itemValue="#{tss.value}" />
<p:ajax listener="#{systemDetailsBean.getTssId}" process="@this"
partialSubmit="true" />
<f:param name="rowidno" value="#{index}" required="true" />
</h:selectOneMenu>
</p:dataTable>
public void getTssId(AjaxBehaviorEvent evt) {
Map<String, String> params = FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
int index = Integer.parseInt(params.get("rowidno"));
String selected = vpmoReqDetailslsList.get(index).getTssReqId();
//I could get the correct rowindex and the selected value using the above code.
if (selected.equalsIgnoreCase("y")) {
vpmoEditFlag = false;
vpmoReqDetailslsList.get(index).setTssReqId("Y");
System.out.println("Yes valuve >>" + vpmoReqDetailslsList.get(index).getTssReqId());
RequestContext.getCurrentInstance().update("vpmoForm:reqTypeDtbl:" + index + ":except");
//I am trying to update the inputtext for the selected row in the datatable from above
} else {
vpmoReqDetailslsList.get(index).setTssReqId("N");
RequestContext.getCurrentInstance().update("vpmoForm:reqTypeDtbl:" + index + ":except");
//I am trying to update the inputtext for the selected row in the datatable from above
}
}
如何从特定行的支持bean中呈现<h:inputText >
。我的意思是,我需要更新数据表中的特定行,并且数据表在表单内。
以下方法对我不起作用
<h:inputText value="#{vpmoReqDtlRow.exceptionNum}" id="javax.faces.ViewState" style="width:100%"
rendered="#{systemDetailsBean.vpmoEditFlag eq true and vpmoReqDtlRow.tssReqId eq 'Y'}" />
有没有其他选项可以更新我在截图中突出显示的数据表中的唯一组件?
任何建议对解决这个问题都非常有帮助。
添加屏幕截图以进一步参考:
答案 0 :(得分:1)
我能够复制问题,这里的问题是你将无法更新未渲染的组件。如果将其更改为禁用,您将看到一切都按预期工作。
在不弄乱布局的情况下更新输入的好方法是使用<h:panelGrupo>
包装它,就像我在这里做的那样:
<h:form id="vpmoForm">
<p:dataTable id="reqTypeDtbl" value="#{systemDetailsBean.vpmoReqDetailslsList}"
var="vpmoReqDtlRow" rowIndexVar="index">
<p:column >
<h:selectOneMenu id="slct" value="#{vpmoReqDtlRow.tssReqId}">
<p:ajax listener="#{systemDetailsBean.getTssId}" />
<f:selectItems value="#{systemDetailsBean.vpmoTSSList}"
var="tss" itemLabel="#{tss.label}" itemValue="#{tss.value}" />
<f:param name="rowidno" value="#{index}" />
</h:selectOneMenu>
</p:column>
<p:column>
<h:panelGroup id="except">
<h:inputText value="#{vpmoReqDtlRow.exceptionNum}" style="width:100%"
rendered="#{systemDetailsBean.vpmoEditFlag and vpmoReqDtlRow.tssReqId eq 'Y'}" />
</h:panelGroup>
</p:column>
</p:dataTable>
</h:form>
注意在getTssId中,每次设置时都将vpmoEditFlag设置为false tssReqId to Y.这可能是个错误。
以下是我正在使用的代码:
public void getTssId(AjaxBehaviorEvent evt) {
Map<String, String> params = FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
int index = Integer.parseInt(params.get("rowidno"));
String selected = vpmoReqDetailslsList.get(index).getTssReqId();
//I could get the correct rowindex and the selected value using the above code.
if (selected.equalsIgnoreCase("y")) {
vpmoEditFlag = true;
System.out.println("Yes valuve >>" + vpmoReqDetailslsList.get(index).getTssReqId());
RequestContext.getCurrentInstance().update("vpmoForm:reqTypeDtbl:" + index + ":except");
//I am trying to update the inputtext for the selected row in the datatable from above
} else {
vpmoEditFlag = false;
RequestContext.getCurrentInstance().update("vpmoForm:reqTypeDtbl:" + index + ":except");
//I am trying to update the inputtext for the selected row in the datatable from above
}
}