簡體   English   中英

Primefaces AJAX事件改變一個菜單中選擇

[英]Primefaces ajax event change one menu select

我正在使用Primefaces 5。

我想在做出選擇時調用監聽器,調用監聽器,但它返回一個空對象;

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

這是我的組件中的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

這是屏幕截圖: 在此處輸入圖片說明

如果我理解正確,我認為您必須直接綁定到Bean上的實體,而不是其ID。 所以用

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

itemValue="#{projet}"

這樣,entityconverter將完成此工作。

正如@Jaqen H'ghar所說,您沒有在Bean中設置Phase對象。

由於您提供列表作為選擇選項

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

您應該將選定的項目反饋給您的bean

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

在這里,您還應該在Bean中為“ TacheComponent”的selectedPhase獲取/設置

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

最后一件事,就是你的類可能是一個POJO,不是一個String對象,所以你不能用對使用它:無需使用轉換器 selectXYZ組件。 我懷疑這是在某個phase.idphase嘗試設置phase.idphase (我也懷疑是String屬性)的原因,然后嘗試使用轉換器,但可能沒有正確設置。 由於您沒有為entityConverter提供代碼,因此很難說出您做錯了什么。

使用轉換器是一項非常簡單的工作。 您只需要花10分鍾來了解它們的工作原理,那么您就很好了。 有一噸的轉換器教程,例如,你可以試試這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM