[英]Primefaces DataTable - rowSelectListener hiding CommandButton inside rows
我有一個PrimeFaces DataTable,其中每一行都有一個save , delete和另一個commandButton 。 dataTable具有selectionMode="single"
和rowSelectListener
。 當我單擊命令按鈕時,將rowSelectListener
,但不會觸發commandButton的動作。
該怎么辦? 我都需要開除!
我無法使用immediate="true"
因為在dataTable之外有一些表單字段必須提交。 它與在命令按鈕中添加的Instant immediate="true"
一起使用。
Primafaces版本:2.2.1 JSF版本:2.0.3
預先感謝您提供任何線索!
碼:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:v="http://java.sun.com/jsf/composite/composite"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:form id="contractReasonAddFormId">
<span class="error">
<h:messages />
</span>
<h:panelGrid columns="2" cellspacing="5" >
<h:outputLabel class="label" value="#{resourceBundle.coAddReason_coStatus_label_Key}" />
<h:outputText class="output" value="#{selectedContractService != null ? selectedContractService.COS_STATUS_DESC : contract.CO_STATUS_DESC}" />
<h:outputLabel class="label" for="reasonId" value="#{resourceBundle.contractChangeStatus_NewReason_Key}:" />
<h:selectOneMenu id="reasonId" value="#{bbNewStatusReason.selectedString}" required="true" requiredMessage="#{resourceBundle.contractChangeStatus_NewReason_Key} #{resourceBundle.valueIsRequired}">
<f:selectItem itemValue="" itemLabel="- #{resourceBundle.contractChangeStatus_SelectReason_Key} -" />
<f:selectItems value="#{bbNewStatusReason.list}" var="r" itemValue="#{r.REASON}" itemLabel="#{r.RS_DES}" />
</h:selectOneMenu>
</h:panelGrid>
<!-- some other form fields --->
<h:panelGrid>
<p:dataTable
id="currentStatusReasonTable"
value="${bbCurrentStatusReason.list}"
var="currStReason"
selectionMode="single"
selection="#{bbCurrentStatusReason.selectedItem}"
rowSelectListener="#{contractAddReasonAction.selectReason}" onRowSelectUpdate="reasonValidityTimes"
>
<p:column sortBy="#{currStReason.RS_DES}" headerText="#{resourceBundle.coAddReason_currStReason_label_Key}">
<h:outputText value="#{currStReason.RS_DES}: "/>
</p:column>
<!-- Other columns -->
<p:column headerText="#{resourceBundle.coAddReason_action_facet_Key}">
<p:commandButton id="updateReasonId" action="dlgUpdate" image="ui-icon ui-icon-pencil" title='#{resourceBundle["button.save"]}' disabled="#{selectedContractService != null ? currStReason.LEVEL == 'C' : false}" >
<f:setPropertyActionListener target="#{bbCurrentStatusReason.selectedItem}" value="#{currStReason}" />
</p:commandButton>
<p:commandButton id="deleteReasonId" action="dlgDelete" image="ui-icon ui-icon-circle-minus" title='#{resourceBundle["button.delete"]}' disabled="#{selectedContractService != null ? currStReason.LEVEL == 'C' : false}" >
<f:setPropertyActionListener target="#{bbCurrentStatusReason.selectedItem}" value="#{currStReason}" />
</p:commandButton>
<p:commandButton id="generateDeleteDocumentsId" action="generateDeleteDocuments" image="ui-icon" title='#{resourceBundle["button.generateDocumentsForDel"]}' immediate="true" rendered="#{showPrintDocument != null}" >
<f:setPropertyActionListener target="#{bbCurrentStatusReason.selectedItem}" value="#{currStReason}" />
</p:commandButton>
</p:column>
</p:dataTable>
</h:panelGrid>
</h:form>
</ui:composition>
我遇到了同樣的問題。 我最終在commandButton上使用的是onclick屬性中的event.stopPropagation()。 這是我的刪除按鈕。
<p:commandButton icon="ui-icon-trash"
onclick="connDelConfirm.show(); event.stopPropagation();"
actionListener="#{connectionController.setSelectedConnection(connection)}"
disabled="#{connection.deleted}"/>
onclick屬性上的其他操作將為Delete操作打開一個確認對話框。 由於事件的傳播已停止。 我需要一種方法仍將所選項目設置為刪除。 這是通過動作偵聽器完成的。 我只是簡單地在bean中調用setSelectedItem方法,並將其從dataTable中傳遞給'var'屬性。
將組件綁定用於具有immediate="true"
輸入組件。
您必須使用immediate="true"
在輸入組件和動作組件之間播放。
您需要參考immediate="true"
JSF生命周期效果;
BeanOne.java
@ManagedBean(name="BeanOne")
@RequestScoped
public class BeanOne {
private HtmlInputText inputText;
public HtmlInputText getInputText() {
return inputText;
}
public void setInputText(HtmlInputText inputText) {
this.inputText = inputText;
}
public void show() {
System.out.println("HtmlInputText ==>" + inputText.getValue());
}
}
pageOne.xthml
<h:inputText binding="#{BeanOne.inputText}" immediate="true"/><br/>
<h:commandButton value="Show_1" action="#{BeanOne.show}" immediate="true"/>
<h:commandButton value="Show_2" action="#{BeanOne.show}"/>
謝謝你的回答。 但是,我所面臨的問題的根本原因卻完全是另外一些原因。
發生的事情是動作已被正確觸發,但是存在一個帶有'required = true'的jsf元素-並拋出了一個驗證錯誤,該錯誤未在任何地方顯示-甚至不在控制台中。 更新(在primaface命令按鈕中,ajax-使用'update ='屬性)錯誤消息顯示頁面布局的窗格后,看到了錯誤消息。
謝謝Rajarshi Mukherjee
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.