0

私は test.xhtml を持っています:

<h:form id="formProduct" >
  <h:panelGroup id="filterProductTotal" layout="block">
    <h:outputText value="#{filtersControllerRequestScoped.filteredProductsCount}"/>                            
  </h:panelGroup>
  <div id="product_container">
    <ui:repeat value="#{filtersControllerRequestScoped.getFilteredProducts(1)}" var="product">  
      <div class="item">
        <util:product-item-preview_2 productItem="#{product}"/>
      </div>
    </ui:repeat>                
  </div>
</h:form>    

メソッド呼び出しの繰り返しの問題について読み、GET メソッドのビジネス ロジックを維持するために戦い、LAZY ロードを実現しようとしました。

フォーム id="formProduct" を更新しない場合でも、さまざまなリクエストで呼び出されるリクエスト スコープ Bean のメソッド getFilteredProducts()。「p:ajax」または「p:remoteCommand」によって呼び出されたリクエストは、「update」アニメーションの有無にかかわらず。

私にとっての問題 - メソッド「getFilteredProducts」が毎回 (ajax 呼び出しごとに) 呼び出される理由がわかりませんが、「filteredProductsCount」はページが読み込まれるときに 1 回だけです。

更新:いくつかのアイデア。

他のリクエストで「#{product}」を使用する場合、実際には単純なオブジェクト「#{product}」ではなく「#{filtersControllerRequestScoped.getFilteredProducts(1).get(INDEX)}」を使用しますか?

更新:の一部<util:product-item-preview_2/>

<composite:interface name="productItemPreview" displayName="hello">
    <composite:attribute name="productItem"/>
</composite:interface>

<composite:implementation>
...
  <h:commandLink value="quick order" onclick="quickOrderPrepare(#{cc.attrs.productItem.productId})">
    <p:ajax process="@this" oncomplete="quickOrderShow()" partialSubmit="true"/>
  </h:commandLink>
...
  <span class="b-prices">
    <h:outputText value="Price: "/>
    <h:outputText value="#{discountControllerRequestScoped.getProductPrice(cc.attrs.productItem)}">
      <f:convertNumber minFractionDigits="2" maxFractionDigits="2"/>
    </h:outputText>
  </span>

...

<script>
function quickOrderPrepare(productId) {
  setProductQuickOrderPanelRemoteCommand([{name: 'productId', value: productId}]);
}            
function quickOrderShow(){
  updateQuickOrderPanelRemoteCommand();
  $('.popup.productQuickOrder').bPopup({            
    onClose: function() { updateBasket(); }
  });                
}
</script>

setProductQuickOrderPanelRemoteCommandおよびupdateQuickOrderPanelRemoteCommandprimefaces remotecommandです。

4

1 に答える 1

0

BalusC のブログに基づいて、私の理解では#{product}、いくつかのリクエストで使用すると、ビュー全体が最初に復元されます。あなたの Bean はであるため、前のリクエストのリスト@RequestScopedには何も残っていません。filteredProductsスコープを に変更しても、 を Bean のプロパティとして@ViewScoped保存していないため、同じ問題が発生する可能性があります。filteredProducts結果として、JSF は何productが送信されたかを知ることができません。したがって、リストが再構築されます。

Bean を変更して、Beanのプロパティとして@ViewScoped保存する必要があると思います。filteredProductsリストを取得するために使用しないでくださいgetFilteredProducts(1)

于 2013-04-08T09:28:57.277 に答える