簡體   English   中英

primefaces / jsf中的p:dataTable / p:dataGrid / p:dataList內的p:commandButton

[英]p:commandButton inside p:dataTable/p:dataGrid/p:dataList in primefaces/jsf

我在p:dataGrid里面有ap:commandButton(我也嘗試過p:dataTable,p:dataList)

命令按鈕動作偵聽器方法未執行,但對服務器進行了ajax調用。

請注意,dataGrid是延遲加載的。

請找到示例代碼:

    <p:dataGrid id="portfolioView" value="#{controller.values}" var="p"
                      lazy="true" rendered="#{controller.hasValues()}"
                      style="width: 100%" paginator="true"  rows="20" columns="1">
            <p:column id="portfolioViewColumn">
              <h:panelGroup id="portfolioPanel" layout="block"
                            style="width: 95%; padding: 20px; margin-bottom: 5px; margin-top: 5px; border-radius: 5px"
                            styleClass="importantpanel_down_less_spread">
                <h:panelGrid columns="3" >
                  <p:graphicImage value="#{controller.photo}" width="60" height="60"/>
                  <h:panelGroup layout="block" style="width: 100%" >
                    <h:outputText value="#{controller.user.name}" style="font-weight: bold; font-size: 12px"/>
                    <br/>
                    <h:outputText value="#{p.dateString}"
                                  style="font-weight: bold; font-size: 12px; color: #454545/>
                    <br/>
                    <h:outputText value="#{p.portfolioTitle}"
                                  style="font-weight: bold; font-size: 14px; color: #454545"/>
                  </h:panelGroup>
                  <h:panelGroup layout="block" >
                    <h:form>
                    <p:commandButton icon="ui-icon-trash" id="deletePortfolio" value="Delete" title="Delete this portfolio"
                                     styleClass="fs-button-portfolio" actionListener="#{controller.deleteValue(p)}"/>
                    <p:commandButton icon="ui-icon-pencil" id="editPortfolio" value="Edit" title="Edit this portfolio"
                                     styleClass="fs-button-portfolio" actionListener="#{controller.editValue(p)}" />
                  </h:form>
                  </h:panelGroup>
                </h:panelGrid>
    </p:column>
    <p:dataGrid>

public void deleteValue(Portfolio portfolio) {
    try {
      System.out.println("Removing portfolio ...");
      portfolioFacade.remove(portfolio);
      JsfUtil.addSuccessMessage("Portfolio Removed", "You have deleted a portfolio from your timeline");
    } catch (Exception e) {
      JsfUtil.addErrorMessage("Failure", "Sorry! We have failed to remove this portfolio from your timeline.");
    }
  }

public void editValue(Portfolio portfolio) {
      System.out.println("Preparing portfolio edit...");
      this.currentPortfolio = portfolio;
  }

我在玻璃魚3.1.2.2,primefaces 3.4,mojarra上運行

謝謝。

當調用迭代組件中的命令組件時,JSF將在處理表單提交期間在迭代組件上重復執行,以便找到正在調用的命令。 為了成功找到它,它要求value="#{controller.values}"rendered="#{controller.hasValues()}"在處理表單提交過程中的評估與在顯示表單時所做的評估完全相同。形成。

您的具體問題表明事實並非如此。 如果getValues()返回一個不兼容更改的列表(即Bean是請求范圍的,並且不基於請求參數保留該列表),或者isHasValues()返回false ,則JSF將無法重復它也因此無法找到正在調用的命令。

因此,為了解決此問題,您只需要確保getValues()isHasValues()在處理表單提交過程中返回的值與顯示表單時返回的值完全相同。 一種簡單的方法是將bean置於視圖范圍內(並確保您沒有在getter方法中執行業務邏輯,而僅在(post)構造方法和(action)偵聽器方法中進行業務邏輯處理)。

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM