Ui:在每次ajax调用时重复计算值表达式



我有test.xhtml with:

<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 load。

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

问题对我来说-我不明白为什么方法"getFilteredProducts"每次被调用(每次ajax调用),但"filteredProductsCount"只有一次当页面加载。

Update: some idea.

可能是当我在其他请求中使用"#{产品}"时,实际上我使用"#{filterscontrollerrequestscope . getfilteredproducts (1).get(INDEX)}",而不是一个简单的对象"#{产品}"?

Update: Part of <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>

setProductQuickOrderPanelRemoteCommandupdateQuickOrderPanelRemoteCommand为主面远程命令

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

我认为你应该将你的bean更改为@ViewScoped,并将你的filteredProducts存储为bean的属性。不要使用getFilteredProducts(1)来获取列表

相关内容

  • 没有找到相关文章

最新更新