0

<f:event type="preRenderView" listener="#{decryptionBean.readAllBoards}>すべてのボタン ( type="button"> ではなく、デフォルトのタイプ) が同じ Bean メソッドを呼び出す原因となっている問題が発生していますdecryptionBean.readAllBoards。具体的には、コードの関連部分であると思われるものを次に示します。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
...
<h:body>
<f:view>
    <f:event type="preRenderView" listener="#{decryptionBean.readAllBoards}"/>
</f:view>
...
<p:layout>
<p:layoutUnit id="andon_layout--board1" position="center"
   size="50%" styleClass="centered">
   <h2>Board 1</h2>
   <h:form id="andon_layout--board1--displayForm">
      <h:outputLabel for="location_list" value="Board List: " />
      <h:selectOneMenu id="location_list" value="Loading..."
         required="false">
         <f:selectItem itemLabel="Select One" itemValue="" />
         <f:selectItems value="#{decryptionBean.locDropDownArray}" />
      </h:selectOneMenu>
      <br />
      <p:commandButton id="loadBoard1" value="Load board" action="#{decryptionBean.loadBoard}"/>
      <h:messages id="b1_messages" />
   </h:form>
</p:layoutUnit>
<p:layoutUnit id="andon_layout--board2" position="east"
   size="50%" styleClass="centered">
   <h2>Board 2</h2>
   <h:form id="andon_layout--board2--displayForm">
      <h:outputLabel for="location_list" value="Board List: " />
      <h:selectOneMenu id="location_list" value="Loading..."
         required="false">
         <f:selectItem itemLabel="Select One" itemValue="#{decryptionBean.display2}" />
         <f:selectItems value="#{decryptionBean.locDropDownArray}" />
      </h:selectOneMenu>
      <br />
      <p:commandButton value="Load board" id="loadBoard2" />
   </h:form>
</p:layoutUnit>
</p:layout>
...

loadBoard1 はdecryptionBean.loadBoard()同様に実行されますがdecryptionBean.readAllBoards()、loadBoard2 のみが実行されdecryptionBean.readAllBoards()ます。行を削除する<f:event type="preRenderView" listener="#{decryptionBean.readAllBoards}>と、loadBoard1 と 2 が正しく機能します (正しいメソッドを呼び出す/メソッドを呼び出しません)。何が起こっているのかについてのアイデアはありますか?

前もって感謝します!

4

1 に答える 1

1

preRenderView イベントに何を期待しているのかわかりませんが、常に RENDER_VIEW フェーズの前に呼び出されます (名前の由来)。

ボタンをクリックするとビューが再レンダリングされるため、ボタンをクリックすると常にメソッドが呼び出されます。ajax を使用してビューの小さな部分のみをレンダリングした場合、イベントはトリガーされません。

ビューがレンダリングされるたびにそのメソッドを呼び出したくない場合は、ViewScoped Bean と @PostConstruct メソッドを試すことができます。

于 2013-07-29T13:32:08.260 に答える