我有一个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?
如果我上面没有选择仓库(---),如何禁用产品选择一个菜单?
为什么我的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>
答案 0 :(得分:-1)
您需要在转换器中处理--- case (ccWarehouseConverter)。
arrayList
禁用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);
}
为了让您的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>