【问题标题】:Add link to dynamically insert an element in JSF/Primefaces selectonemenu添加链接以在 JSF/Primefaces selectonemenu 中动态插入元素
【发布时间】:2015-12-05 15:38:41
【问题描述】:

是否可以将项目动态插入到单选菜单中:

目前用户必须转到另一个可以添加工作的页面:

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

【问题讨论】:

  • So, basically, you want to add a dummy select item which when selected shows some dialog with that "Add new job" form and then refreshes the column in the parent page with the new job preselected in the行?
  • 是的,预选将是一个奖励!我在想的另一个想法是在数据表的顶部有一个命令按钮,它将打开一个对话框,其功能与 Add New Job.xhtml 页面相同。但你的想法会更有效率。

标签: jsf primefaces selectonemenu


【解决方案1】:

您可以尝试为您的新项目添加字段。如下所示:

bean 代码:

private Job newJob;
private Job addesJob;

public Job getNewJob() {
   return newJob;
}

public void setNewJob(Job newJob) {
   this.newJob = newJob;
}

public Job getAddedJob() {
   return addedJob;
}

public void setAddedJob(Job addedJob) {
   this.addedJob = addedJob;
}

public void needCreateJob() {
   if (addedJob.equals(newJob)) {
      RequestContext.getCurrentInstance().execute("PF('jobCreationDlgVar')
        .show()");
   }
}

查看代码:

<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>

【讨论】:

    【解决方案2】:

    这可以通过提供一个虚拟选择项并在 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()");
        }
    
        // ...
    }
    

    <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>
    

    【讨论】:

    • 你的开球对我有用。谢谢你。起初它没有,直到我使用omnifaces.SelectItemsConverter 代替我自己的转换器,但我的转换我认为很好,基于你在这里stackoverflow.com/questions/17052503/… 关于转换器的帖子。我还必须调整一些支持豆; selectonemenu 默认为“添加新作业”,因为新作业的选择项和 null 的 noSelectionOption 值都匹配为默认值
    • “添加新工作”项不应为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多