SelectOneMenu依赖于其他selectOneMenu - Jsf

时间:2015-11-11 10:47:39

标签: jsf primefaces wildfly

我有一个Web应用技术:Wildfly,JSF,Primefaces

我必须选择One Menus。第一个Select One Menu加载所有仓库,第二个Select One Menu加载所有依赖于所选仓库的产品。

我想实现可靠性,我没有必要选择仓库。我希望有可能我不选择仓库,而且逻辑上如果我不选择仓库,产品选择一个菜单必须被禁用。

如果我在没有仓库的情况下提交表单,则应将其写入数据库null以用于仓库,并且对于产品也应为null。

我的第一次尝试是在仓库的选择菜单中执行以下输入。

<f:selectItem itemLabel="---" itemValue="#{null}" value="#{null}"/>

现在,我不知道如果我没有选择仓库,如何设置仓库的价值选择一个菜单为空。

value="#{warehouseDataActions.actualWarehouse}" --> how to set to null 

第二个问题是,在第一个选择菜单的Ajax中我必须添加Attribute immediate = true。如果我添加以下行,此属性仅对我来说是必要的。我不知道为什么?

<f:selectItem itemLabel="---" itemValue="#{null}" value="#{null}"/>

所以我有三个问题:

1 - 如何将actualWarehouse和.actualWriteservice.warehouseProduct设置为null?

  1. 如果我上面没有选择仓库(---),如何禁用产品选择一个菜单?

  2. 为什么我的Ajax请求在仓库中选择一个菜单不起作用,如果我添加项目

    <p:selectOneMenu style="width:151px"
    value="#{warehouseDataActions.actualWarehouse}">
        <f:converter converterId="ccWarehouseConverter" />
        <f:selectItem itemLabel="---" itemValue="#{null}" value="#{null}"/>
        <f:selectItems
            value="#{warehouseDataActions.allWarehousesForProject}"
            var="warehouse"
            itemLabel="#{warehouse.warehouseName}"
            itemValue="#{warehouse}" />
        <p:ajax listener="#{warehouseProductDataActions.warehouseProductsForWarehouse}"
            update="products" />
    

    <p:panelGrid>
        <p:outputLabel for="products">#{texts['writeservice.product']}</p:outputLabel>
        <p:selectOneMenu id="products" style="width:151px"
            value="#{writeserviceDataActions.actualWriteservice.warehouseProduct}">
            <f:converter converterId="ccWarehouseProductConverter" />
            <f:selectItems
                value="#{warehouseProductDataActions.warehouseProductsResult}"
                var="warehouseProduct" itemLabel="#{warehouseProduct.product.productName}"
                itemValue="#{warehouseProduct}" />
        </p:selectOneMenu>
    </p:panelGrid>
    

1 个答案:

答案 0 :(得分:-1)

  1. 您需要在转换器中处理--- case (ccWarehouseConverter)。

    arrayList
  2. 禁用selectOne

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || value.length() == 0 || value.equalsIgnoreCase("---")) {
            return null;
        }
        return databaseService.getWarehouseByName(value);
    }
    
  3. 为了让您的ajax更新正常工作,您必须将仓库和产品封装在母板中,然后更新母亲:

    <p:panelGrid>
      <p:outputLabel for="products">#{texts['writeservice.product']}</p:outputLabel>
      <p:selectOneMenu id="products" style="width:151px" disabled="#{empty warehouseDataActions.actualWarehouse}"
        value="#{writeserviceDataActions.actualWriteservice.warehouseProduct}">
        <f:converter converterId="ccWarehouseProductConverter" />
        <f:selectItems
            value="#{warehouseProductDataActions.warehouseProductsResult}"
            var="warehouseProduct" itemLabel="#{warehouseProduct.product.productName}"
            itemValue="#{warehouseProduct}" />
       </p:selectOneMenu>
    </p:panelGrid>