0

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;
  }

Glassfish 3.1.2.2、primefaces 3.4、mojarraで実行します

ありがとう。

4

1 に答える 1

0

反復コンポーネント内のコマンド コンポーネントが呼び出されると、JSF はフォーム送信の処理中に、呼び出されているコマンドを見つけるために反復コンポーネントを繰り返し処理します。したがって、フォームを正常に見つけるには、フォーム送信の処理中に と がフォームの表示中に行ったのとまったく同じように評価する必要がvalue="#{controller.values}"あります。rendered="#{controller.hasValues()}"

あなたの具体的な問題は、そうではなかったことを示唆しています。が互換性のない変更されたリストを返した場合getValues()(つまり、Bean がリクエスト スコープであり、リクエスト パラメーターに基づいてリストを保持しない場合)、または が をisHasValues()返した場合false、JSF はそれを反復処理できず、したがって変更もできません。呼び出されているコマンドを見つけます。

したがって、この問題を解決するには、フォーム送信の処理中に と がフォームの表示中に行った値とまったく同じ値getValues()を返すようにする必要があります。isHasValues()簡単な方法は、Bean をビュー スコープに配置することです (そして、ビジネス ロジックをゲッター メソッドで実行するのではなく、(ポスト) コンストラクターおよび (アクション) リスナー メソッドでのみ実行するようにします)。

以下も参照してください。

于 2013-02-18T11:34:28.197 に答える