私は 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
およびupdateQuickOrderPanelRemoteCommand
primefaces remotecommandです。