添加链接以在JSF/Primefaces selectonemenu中动态插入元素

添加链接以在JSF/Primefaces selectonemenu中动态插入元素,jsf,primefaces,selectonemenu,Jsf,Primefaces,Selectonemenu,是否可以将项目动态插入“选择一个”菜单: 当前,用户必须转到另一个页面,以便添加作业: 然后导航回第一个视图,查看更新的下拉列表和新添加的选择项。一个更有效的选择是允许用户在该视图中即时插入,然后在下拉列表中选择它 您可以尝试为新项目添加字段。其内容如下: bean的代码: 查看代码: 这可以通过提供一个虚拟选择项并在ajax更改侦听器中显式检查它来实现。选择后,只需显示对话框。保存对话框后,保存新作业并重置虚拟选择项 这里有一个启动示例 @Named @ViewScoped public

是否可以将项目动态插入“选择一个”菜单:

当前,用户必须转到另一个页面,以便添加作业:


然后导航回第一个视图,查看更新的下拉列表和新添加的选择项。一个更有效的选择是允许用户在该视图中即时插入,然后在下拉列表中选择它

您可以尝试为新项目添加字段。其内容如下:

bean的代码:

查看代码:


这可以通过提供一个虚拟选择项并在ajax更改侦听器中显式检查它来实现。选择后,只需显示对话框。保存对话框后,保存新作业并重置虚拟选择项

这里有一个启动示例

@Named
@ViewScoped
public class Bean implements Serializable {

    private List<Activity> activities;
    private List<Job> jobs;
    private Job newJob;

    @EJB
    private YourActivityService yourActivityService;

    @EJB
    private YourJobService yourJobService;

    @PostConstruct
    public void init() {
        activities = yourActivityService.list();
        jobs = yourJobService.list();
        newJob = new Job();
    }

    public void addNewJobIfNecessary(AjaxBehaviorEvent event) {
        if (newJob.equals(((UIInput) event.getComponent()).getValue())) {
            RequestContext ajax = RequestContext.getCurrentInstance();
            ajax.update("addNewJobDialog");
            ajax.execute("PF('widget_addNewJobDialog').show()");
        }
    }

    public void saveNewJob() {
        yourJobService.save(newJob);
        jobs.add(newJob);
        newJob = new Job();

        RequestContext ajax = RequestContext.getCurrentInstance();
        ajax.update("activitiesForm");
        ajax.execute("PF('widget_addNewJobDialog').hide()");
    }

    // ...
}
@Named
@视域
公共类Bean实现了可序列化{
私人名单


因此,基本上,您希望添加一个虚拟选择项,当选中该项时,将显示“添加新作业”对话框表单,然后使用行中预选的新作业刷新父页面中的列?是的,预选将是一个额外的好处!我想的另一个想法是在数据表的顶部有一个命令按钮,它将打开一个对话框,具有与Add new job.xhtml页面相同的功能。但是您的想法将更加有效。您的开球对我来说很有用。谢谢。起初我用omnifaces.SelectItemsConverter代替了我自己的转换器,但根据你在这里关于转换器的帖子,我认为我的转换很好。我还必须调整一些支持bean;SelectOne菜单默认为“添加新工作”由于新作业的select项和NOSELECTOPTION值null都作为默认值匹配,“添加新作业”项不应为null。
<p:selectOneMenu value="#{bean.addedJob}">
   <f:selectItem value="#bean.newJob}"/>
   <p:ajax event="change" listener="#{bean.needCreateJob()}" process="@this"/>
   <f:selectItem value="#{bean.jobs}" var="job" itemLabel="#{job.name}" itemValue="#{job}"/>
</p:selectOneMenu>
@Named
@ViewScoped
public class Bean implements Serializable {

    private List<Activity> activities;
    private List<Job> jobs;
    private Job newJob;

    @EJB
    private YourActivityService yourActivityService;

    @EJB
    private YourJobService yourJobService;

    @PostConstruct
    public void init() {
        activities = yourActivityService.list();
        jobs = yourJobService.list();
        newJob = new Job();
    }

    public void addNewJobIfNecessary(AjaxBehaviorEvent event) {
        if (newJob.equals(((UIInput) event.getComponent()).getValue())) {
            RequestContext ajax = RequestContext.getCurrentInstance();
            ajax.update("addNewJobDialog");
            ajax.execute("PF('widget_addNewJobDialog').show()");
        }
    }

    public void saveNewJob() {
        yourJobService.save(newJob);
        jobs.add(newJob);
        newJob = new Job();

        RequestContext ajax = RequestContext.getCurrentInstance();
        ajax.update("activitiesForm");
        ajax.execute("PF('widget_addNewJobDialog').hide()");
    }

    // ...
}
<h:form id="activitiesForm">
    <p:dataTable value="#{bean.activities}" var="activity">
        <p:column>#{activity.id}</p:column>
        <p:column>
            <p:selectOneMenu value="#{activity.job}" converter="omnifaces.SelectItemsConverter">
                <f:selectItem itemValue="#{null}" itemLabel="Select one" />
                <f:selectItems value="#{bean.jobs}" />
                <f:selectItem itemValue="#{bean.newJob}" itemLabel="Add new Job" />
                <p:ajax listener="#{bean.addNewJobIfNecessary}" />
            </p:selectOneMenu>
        </p:column>
    </p:dataTable>
</h:form>

<p:dialog id="addNewJobDialog">
    <h:form>
        <p:inputText value="#{bean.newJob.name}" required="true" />
        <p:commandButton value="Add" action="#{bean.saveNewJob}" update="@form" />
        <p:messages />
    </h:form>
</p:dialog>