gpt4 book ai didi

jsf - 当选择父列表中的标记项目时重置子 p :selectOneMenus inside a p:dataTable to empty,

转载 作者:行者123 更新时间:2023-12-02 00:47:29 27 4
gpt4 key购买 nike

MySQL数据库中有三张表,category , sub_categorybrand (制造商)哪里category是其余部分的父项,即 sub_categorybrand 。我希望,基于表格关系,菜单之间的关系能够更加清晰。

全部三个<p:selectOneMenu> s 被放置在 <p:dataTable> 内在 <p:column> 标识的三个相应列中。我忽略了<p:column> , <p:cellEditor> , <f:facet name="output"> , <f:facet name="input"> , <p:rowEditor>以及所有这些为简洁起见的麻烦。

<子> row对应于 JPA 托管实体 product在这种情况下,如 var="row" 指定在 <p:dataTable>关联。

这是实际的问号:当一个项目(第一个)带有 nullcategoryList 中的值(父级)被选中,其子级列出 subCategoryListbrandList应休息清空。

类别列表:

<p:selectOneMenu id="categoryList"
value="#{row.category}"
required="#{param['javax.faces.source'] ne component.clientId}">

<f:selectItem itemLabel="Select"
itemValue="#{null}"/>
<!-- When this item is selected, its children below should be reset to empty. -->

<f:selectItems var="category"
value="#{productManagedBean.categories}"
itemLabel="Select"
itemValue="#{category}"/>

<p:ajax update="subCategoryList brandList"/>
<!-- The listener functionality is left incomplete here. -->
</p:selectOneMenu>

子类别列表:

<p:selectOneMenu id="subCategoryList"
value="#{row.subCategory}">

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

<f:selectItems var="subCategory"
value="#{productManagedBean.getSubCategories(row.category)}"
itemLabel="#{subCategory.subCatName}"
itemValue="#{subCategory}"
rendered="true"/>
</p:selectOneMenu>

品牌(制造商)列表:

<p:selectOneMenu id="brandList"
value="#{row.brand}">

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

<f:selectItems var="brand"
value="#{productManagedBean.getBrands(row.category)}"
itemLabel="#{brand.brandName}"
itemValue="#{brand}"
rendered="true"/>
</p:selectOneMenu>

托管bean(在这个问题的上下文中可以忽略惰性数据模型):

@Named
@ViewScoped
public class ProductManagedBean extends LazyDataModel<Product> implements Serializable {

@Inject
private Service service;

// Associated with <p:selectOneMenu id="categoryList">.
private List<Category> categories; // Getter & setter.

// These are merely helper maps to reduce possible database calls.
private Map<Category, List<SubCategory>> subCategoriesByCategory;
private Map<Category, List<Brand>> brandByCategory;

public ProductManagedBean() {}

@PostConstruct
private void init() {
// This can be application scoped somewhere else as per business requirement.
categories = service.getCatgeoryList();

subCategoriesByCategory = new HashMap<Category, List<SubCategory>>();
brandByCategory = new HashMap<Category, List<Brand>>();
}

// This method populates <f:selectItems> associated with <p:selectOneMenu id="brandList">.

public List<SubCategory> getSubCategories(Category category) {
// category is never null here unless something is broken deliberately.

if (category == null) {
return null;
}

List<SubCategory> subCategories = subCategoriesByCategory.get(category);

if (subCategories == null) {
subCategories = service.findSubCategoriesByCategoryId(category.getCatId());
subCategoriesByCategory.put(category, subCategories);
}

return subCategories;
}

// This method populates <f:selectItems> associated with <p:selectOneMenu id="brandList">.
public List<Brand> getBrands(Category category) {
// category is never null here unless something is broken deliberately.

if (category == null) {
return null;
}

List<Brand> brands = brandByCategory.get(category);

if (brands == null) {
brands = service.findBrandsByCategoryId(category.getCatId());
brandByCategory.put(category, brands);
}

return brands;
}
}

无论如何,这些菜单中的选定值都不会提供给相应的支持 bean。它仅在 JPA 支持的模型中可用(分别为 value="#{row.category}"value="#{row.subCategory}"value="#{row.brand}" )。

► 如何向支持 bean 发送第一个带有 null 的项目的信号选择父菜单中的值(标记为“选择”)以便将其子列表重置为空?如果不可行,这应该以任何可行的方式发生。

我正在使用 PrimeFaces 5.2 Final(社区版本)和 Mojarra 2.2.12。

<小时/>

除非底层数据库表中有一个空外键,专门使用供应商特定的ON DELETE SET NULL,否则不需要这样做。选项允许每个(或某些)相应的子行中有一个可选的父行。

最佳答案

到目前为止,您需要确保 <f:selectItem> getter 被调用时带有 null争论。换句话说,#{row.category}必须是null 。鉴于您支持 #{row.category}使用此答案中显示的模型 Populate p:selectOneMenu based on another p:selectOneMenu in each row of a p:dataTable ,最有可能如下,

@Transient
private Category category;

public Category getCategory() {
return (category == null && subCategory != null) ? subCategory.getCategory() : category;
}

然后是#{row.category}实际上永远不会null当有subCategory时。当现有数据条目显示在 View 中时就会出现这种情况。

您基本上需要显式地清空 subCategory (和 brand )当 transient category 时属性显式设置为 null。与此同时,这一疏忽已在上述答案中得到修复。这是您的新 setCategory() 的方式方法应如下所示:

public void setCategory(Category category) {
this.category = category;

if (category == null) {
subCategory = null;
brand = null;
}
}

这样,getCategory()将正确返回null因此传入的 #{row.category}还有。

关于jsf - 当选择父列表中的标记项目时重置子 p :selectOneMenus inside a p:dataTable to empty,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736958/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com