Primefaces ajax事件更改一个菜单选择

时间:2014-06-16 13:24:06

标签: jquery ajax jsf jsf-2 primefaces

我正在使用Primefaces 5。

我想在选择时调用Listener,调用侦听器但返回null对象;

我的JSF页面中有以下内容

<ui:define name="page-content">
        <h:form prependId="false">
            <p:commandButton image="back" ajax="false" immediate="true" style="margin-right:20px;" value="#{phasemsgs['navigation.back']}" action="/boo/viewMesTaches.xhtml"/>

            <p:panel header="#{phasemsgs['tache.title']} Details" style="margin-top:10px">
                <p:messages />
                <h:panelGrid id="detail" columns="2" styleClass="grid" columnClasses="label,value">
                    <h:outputText value="#{phasemsgs['tache.nomtache.title']}:" />
                            <h:inputText id="phase_nomtache" value="#{TacheComponent.tache.nomtache}" required="false" label="phase_nomtache" />
<h:outputText value="Projet :*" />

                    <h:selectOneMenu id="selectProjet"
                        value="#{ProjetComponent.projet.idprojet}" required="false">

                        <f:selectItem itemLabel="Select One" itemValue="" noSelectionOption="true" />
                        <f:selectItems value="#{ProjetComponent.listProjets()}"
                            var="projet" itemValue="#{projet.idprojet}"
                            itemLabel="#{projet.nomprojet}" />
                            <p:ajax listener="#{ProjetComponent.onProjetChange()}"
                            update="selectPhase" />

                        <f:converter converterId="entityConverter" />

                    </h:selectOneMenu>

                    <h:outputText value="Phase :*" />

                <h:selectOneMenu id="selectPhase"
                        value="#{TacheComponent.tache.phase.idphase}" required="false">
                        <f:selectItem itemLabel="Select One" itemValue="" />
                        <f:selectItems value="#{ProjetComponent.listPhases}" var="phase"
                        itemValue="#{phase}" itemLabel="#{phase.typephase}" />
                        <f:converter converterId="entityConverter" />
                    </h:selectOneMenu>

                </h:panelGrid>

这是我的Component中的onProjetChange方法:

@Scope("session")
@Component("ProjetComponent")
public class ProjetComponentImpl implements ProjetComponent {
    private Projet projet;
    List<Phase> listPhases;
    @Autowired
    private ProjetDAO projetDAO;
        getters and setters ..
    public ProjetComponentImpl() {
    }
    @PostConstruct
        public void init() {
            //initialize the data here

            this.projet=new Projet();
            this.listPhases=new ArrayList<Phase>();
        }

    public void onProjetChange() {
            if(projet !=null && !projet.equals(""))
            {
               listPhases = new ArrayList<Phase> (projet.getPhases());
            System.out.println("onProjetChange Clause if:" + projet.getNomprojet());

            }
            else{
                listPhases = new ArrayList<Phase>();
                System.out.println("onprojetChange else:"+projet.getNomprojet());

            }

这是堆栈跟踪:

onProjetChange Clause if:null

这是一个截图: enter image description here

2 个答案:

答案 0 :(得分:1)

如果我理解正确,我认为你必须直接绑定到bean上的实体,而不是它的id。所以,使用

<h:selectOneMenu id="selectProjet" value="#{ProjetComponent.projet}" required="false">

itemValue="#{projet}"

这样,实体转换器就能完成这项工作。

答案 1 :(得分:1)

正如@Jaqen H&#39; ghar所说,你没有为你的Bean设置一个Phase对象。

由于您提供了一个列表作为选择选项

<f:selectItems value="#{ProjetComponent.listPhases}" .../>

您应该将所选项目反馈给您的bean

<h:selectOneMenu value="#{TacheComponent.selectedPhase}" ..>

其中,你也应该在你的Bean中为selectedPhase设置一个get / set,名为&#39; TacheComponent&#39;

    private Phase selectedPhase;
public Phase getSelectedPhase() {
    return selectedPhase;
}
public void setSelectedPhase(Phase selectedPhase) {
    this.selectedPhase = selectedPhase;
}

最后一点是,您的阶段类可能是 Pojo 不是字符串对象,因此您无法将其与p一起使用:selectXYZ组件,不使用转换器。我怀疑这是尝试设置phase.idphase(我也怀疑是String属性)的原因,然后你尝试使用转换器,但你可能没有设置正确。由于您没有为 entityConverter 提供代码,因此很难说出您做错了什么。

使用转换器是一项非常简单的工作。你真的需要花10分钟来了解它们是如何工作的,而且你很乐意去。有很多关于转换器的教程,例如你可以尝试this one