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加载。

请求范围 bean 中的方法 getFilteredProducts() 在各种请求中调用,即使我不更新表单 id="formProduct"。由“p:ajax”或“p:remoteCommand”调用的请求,带有和不带有“update” anithig。

我的问题 - 我不明白为什么每次(每次 ajax 调用)都调用方法“getFilteredProducts”,但在加载页面时只调用一次“filteredProductsCount”。

更新:一些想法。

可能是当我在其他请求中使用“#{product}”时,实际上我使用的是“#{filtersControllerRequestScoped.getFilteredProducts(1).get(INDEX)}”,而不是简单的对象“#{product}”?

更新:部分<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远程命令。

4

1 回答 1

0

根据BalusC 的博客,据我了解,当您#{product}在某些请求中使用时,首先会恢复整个视图。由于您的 bean 是,因此上一个请求@RequestScoped的列表中没有任何内容。filteredProducts即使您将范围更改为@ViewScoped,您仍然可能遇到同样的问题,因为您没有将 存储filteredProducts为 bean 的属性。结果,JSF 无法知道product提交了什么。因此,您的列表将被重建。

我认为您应该将 bean 更改为@ViewScoped并将您的 bean 存储filteredProducts为 bean 的属性。不要getFilteredProducts(1)用来把清单拿出来。

于 2013-04-08T09:28:57.277 回答