2013-02-21 38 views
0

我有啊:selectOneMenu,當它的值更改爲特定值(比如「2」)時,它假設顯示隱藏的字段then(hasn沒有被渲染)。注意到它們與託管bean中屬性的值相同。h:inputText在更改時不重新顯示h:selectOneMenu值,不能按預期工作

<h:outputText value="Function:"></h:outputText> 
<h:selectOneMenu id="funDrp" converter="FunctionConv" value="#{cardBean.card.functionId}"> 
    <f:selectItems value="#{commonData.functions}" var="c" itemLabel="#{c.description}" itemValue="#{c.functionId}" /> 
    <f:ajax render="@form" execute="@form" event="valueChange" /> 
</h:selectOneMenu> 

<h:outputText value=" Profile Id:" rendered="#{(cardBean.card.functionId.functionId==2)}"></h:outputText> 
<h:inputText id="card_refillProfileId"rendered="#{(cardBean.card.functionId.functionId==2)}" label="Refill Profile Id" required="true" value="#{cardBean.card.refillProfileId}"></h:inputText> 

<h:outputText value="Origin Type:" rendered="#{(cardBean.card.functionId.functionId==2)}"></h:outputText> 
<h:inputText id="card_originType" rendered="#{(cardBean.card.functionId.functionId==2)}" label="Origin Node Type" required="true" value="#{cardBean.card.originType}"></h:inputText> 

他們工作正常,如果「卡」對象分配給現有的實體,但如果它是一個新的 - 如預期它不工作。

+0

請詳細說明「不工作按預期」的開發者條款。究竟發生了什麼(不)? – BalusC 2013-02-21 12:10:00

+0

支持bean的範圍是什麼? – kolossus 2013-02-21 14:17:53

回答

0

問題是附加到選擇菜單的值是「card.functionId」。因此,在檢查它之前初始化它。因爲我在構建bean之前嘗試初始化它,但它沒有幫助。

這樣做,初始化是通過附加一個「ValueChangeListener」做了selectOneMenu用於

<h:selectOneMenu id="funDrp" converter="FunctionConv" valueChangeListener="#  {cardBean.changeCardFunc}" 
              value="#{cardBean.card.functionId}"> 
              <f:selectItems value="#{commonData.functions}" var="c" 
              itemLabel="#{c.description}" itemValue="#{c.functionId}" /> 
              <f:ajax render="@form" execute="funDrp" event="change" /> 
              </h:selectOneMenu> 

,並在Managed Bean:

public void changeCardFunc(ValueChangeEvent e) { 
// object newFunc= e. 

    if(card!=null){ 
    card.setFunctionId((Function)e.getNewValue()); 
    }else { 
     card= new Card(); 
     card.setFunctionId((Function)e.getNewValue()); 
     System.err.println(e.getNewValue()); 
    } 
} 
-1

嘗試

<f:ajax render="card_refillProfileId card_originType" execute="@form" event="valueChange" /> 
+0

我不能呈現不存在的東西http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#AjaxRenderingOfContentWhichIsByItselfConditionallyRendered – 2013-02-21 10:13:46

-1

<f:ajax render="@form" execute="@form" event="valueChange" /> 

應(可省略事件)

<f:ajax render="@form" execute="@form" event="change" /> 

似乎有selectOneMenu.value之間的不匹配,你的轉換器和渲染EL。 有兩次functionId.functionIdselectOneMenu.value綁定到cardBean.card.functionId。我可能錯了,如果functionId是一個函數。

+0

它們工作正常,如果「卡」對象被分配給一個現有的實體它工作正常,但如果它是一個新的它不does – 2013-02-21 10:14:33

+0

如果「卡」對象被分配給一個現有的實體',你是什麼意思?你的意思是如果'cardBean.card'被初始化了嗎? – 2013-02-21 10:38:40

+0

嗯,我已經初始化它到處,當我聲明它和@PostConstructor,但沒有解決它 – 2013-02-21 12:01:48

0

這是一個完全預期的行爲。使用<f:ajax>,您可以重新呈現DOM中存在的HTML元素,但通過在JSF組件中指定rendered="false",它們不會出現在DOM中。而且,由於阿賈克斯需要找到這個元素通過它的id,並且之後替換它,這個工作顯然是無法完成的。

你的工作,但是,可以通過擁抱你的組件在<h:panelGroup id="to-be-rerendered">,它總是呈現在一個容器中(所有這些使用rendered屬性),例如,但它的孩子處理 - 沒有。因此,如果滿足條件,ajax將能夠重新渲染面板,該面板將包含您的所有組件,並且它們將出現在您的視圖中。

作爲一個方面說明,如果您的視圖/表單增長,您的ajax行爲可能會非常昂貴。因此,如果您只想要重新渲染某些組件,請在您的<f:ajax>標記中指定它:<f:ajax render="to-be-rerendered" />(要渲染的組件的空格分隔ID列表)。

+0

OP使用'render =「@form」',所以我沒有看到問題。 – BalusC 2013-02-21 12:09:23

+0

@BalusC我並不是說這是一個問題,但我想指出Marwa的注意力是逃避非民族的渲染,因爲它不必要地增加了ajax響應的大小。 – skuntsel 2013-02-21 12:13:26