Primefaces 如何构建引导面<;b:下拉菜单>;动态地

Primefaces 如何构建引导面<;b:下拉菜单>;动态地,primefaces,jsf-2.2,bootsfaces,Primefaces,Jsf 2.2,Bootsfaces,我的应用程序基于JSF2.2和Primefaces 6.2。我需要创建一个菜单栏,其中子菜单将显示在“下拉菜单”中,而不是下拉菜单。我无法在Primefaces中实现这种下拉效果,必须使用Bootsfaces的组件,该组件为此提供了一个“drop”属性(drop=“up”创建一个下拉)。详情如下: 使用,它以这种方式呈现,这对我来说很好: . 但是,我需要通过Java代码动态构建 是否可以在中使用某种模型属性,类似于Primefaces菜单的功能? 在我当前的代码中,我以这种方式硬编码了子菜单

我的应用程序基于JSF2.2和Primefaces 6.2。我需要创建一个菜单栏,其中子菜单将显示在“下拉菜单”中,而不是下拉菜单。我无法在Primefaces中实现这种下拉效果,必须使用Bootsfaces的
组件,该组件为此提供了一个“drop”属性(drop=“up”创建一个下拉)。详情如下:

使用
,它以这种方式呈现,这对我来说很好: . 但是,我需要通过Java代码动态构建

是否可以在
中使用某种模型属性,类似于Primefaces菜单的功能?

在我当前的代码中,我以这种方式硬编码了子菜单,我希望将其删除并动态构建:

<b:navBar inverse="true" fluid="true" >
    <b:navbarLinks >
        <b:dropMenu value="Vehicle Services" drop="up" >
            <b:navLink value="Repairs" href="#"></b:navLink>
            <b:navLink value="Sales" href="#"></b:navLink>
            <b:navLink value="Financing" href="#"></b:navLink>
            <b:navLink value="Insurance" href="#"></b:navLink>
            <b:navLink value="Leasing" href="#"></b:navLink>
            <b:navLink value="Driving School" href="#"></b:navLink>
            <b:navLink value="Legal" href="#"></b:navLink>
        </b:dropMenu>
        .........
        .........
        .........
在我正在使用的实用工具.createValueExpression()中…目的是将字符串设置为valueExpression:

public static ValueExpression createValuExpression(String expression, Class clazz) {
        FacesContext fc = FacesContext.getCurrentInstance();
        ELContext elContext = fc.getELContext();
        ExpressionFactory expFactory = fc.getApplication().getExpressionFactory();
        ValueExpression ret = expFactory.createValueExpression(elContext, expression, clazz);

        return ret;
    }

遗憾的是,在UI上,只有DropMenu(即“Vehicle Services”)出现,但我在它下面定义的两个导航链接都没有。我不太确定我做错了什么。我怀疑这是否与我为DropMenu设置valueExpression的方式有关(尽管“Vehicle Services”的值与向上插入符号图标一起显示得很好)。

我没有找到允许使用PrimeFaces方式指定动态菜单模型的属性,但这里有一个解决方法:

<h:form>
    <b:navBar inverse="true" fluid="true">
        <b:navbarLinks>
            <b:dropMenu value="Vehicle Services" drop="up">
                <f:event listener="#{myBean.initializeDropMenuChildren}"
                    type="postAddToView" />
            </b:dropMenu>
        </b:navbarLinks>
    </b:navBar>
</h:form>
编辑:

作为对编辑的响应:看起来
b:navbarLinks
组件不喜欢在xhtml中完全为空。尝试将f:event直接添加到
b:navBar
中,并从中添加所有子项。或将标记更改为:

<h:form>
    <b:navBar>
        <b:navbarLinks>
            <b:dropMenu value="dummy" drop="down"/>
            <f:event listener="#{myBean.initializeDropMenuChildren}"
                type="postAddToView" />
        </b:navbarLinks>
    </b:navBar>
</h:form>


在添加
下拉菜单之前,请执行
组件.getChildren().clear()
要删除虚拟
下拉菜单

非常感谢@Selaron。您的代码示例工作得很好。接下来,我尝试从一个级别上动态构建菜单。我的意思是从
级别本身,而不是
级别。对我来说,只有DropMenu被显示,但是我在bean中定义的navlink没有显示。你知道会出什么问题吗?我已经在我的原始帖子中添加了我目前正在试用的代码。@Tatha这很奇怪-我已经测试并编辑了我的答案。希望能有帮助。效果很好…你的建议是添加虚拟的
下拉菜单
。非常感谢:)@Tatha不客气。如果这是你的问题的答案,请考虑接受它。
<h:form>
    <b:navBar inverse="true" fluid="true">
        <b:navbarLinks>
            <b:dropMenu value="Vehicle Services" drop="up">
                <f:event listener="#{myBean.initializeDropMenuChildren}"
                    type="postAddToView" />
            </b:dropMenu>
        </b:navbarLinks>
    </b:navBar>
</h:form>
package my.package;

import javax.faces.component.UIComponent;
import javax.faces.event.ComponentSystemEvent;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

import net.bootsfaces.component.dropMenu.DropMenu;
import net.bootsfaces.component.navLink.NavLink;

@Named
@RequestScoped
public class MyBean {

    public void initializeDropMenuChildren(ComponentSystemEvent e) {
        UIComponent component = e.getComponent();
        assert component instanceof DropMenu;

        NavLink navLink = new NavLink();
        navLink.setValue("wow");
        navLink.setHref("#");
        component.getChildren().add(navLink);

    }

}
<h:form>
    <b:navBar>
        <b:navbarLinks>
            <b:dropMenu value="dummy" drop="down"/>
            <f:event listener="#{myBean.initializeDropMenuChildren}"
                type="postAddToView" />
        </b:navbarLinks>
    </b:navBar>
</h:form>