2010-02-15 56 views
0

我正在使用RichFaces的a4j:支持切換頁面上某些控件的可見性。但是,當h:selectOneRadio按鈕rdoRequestType發生更改時,它將清除ID爲「media」的a4j:outputPanel中txtLibraryServerNumber和其他控件的值。爲什麼頁面上的一個AJAX調用會干擾另一個AJAX面板?AJAX調用清除無關控件中的值

我已經嘗試在selectOneRadio上使用a4j:support標籤上的「process」屬性,因此它將其他面板中的文本框的值寫入Seam bean,但這沒有任何效果。我做錯了什麼?幫幫我!我正在失去理智!

<h:selectOneRadio value="#{webencode.requestType}" 
    id="rdoRequestType" styleClass="radio" style="width:295px" layout="pageDirection" > 
    <f:selectItem itemValue="program" itemLabel="Series or Individual Program"/> 
    <f:selectItem itemValue="promo" itemLabel="Promo" /> 
    <f:selectItem itemValue="specific" itemLabel="Specific Format Encoding Request"/> 
    <a4j:support ajaxSingle="true" event="onclick" reRender="program" process="txtLibraryServerNumber,txtDigitalMediaFileName"/> 
</h:selectOneRadio> 

<a4j:outputPanel id="program" ajaxRendered="true"> 
    <s:span rendered="#{('program' == webencode.requestType || 'promo' == webencode.requestType) ? true : false}"> 
    <h:selectOneMenu value="#{webencode.seriesId}" id="lstSeriesName"> 
     <f:selectItems value="#{webencode.programItems}"/> 
    </h:selectOneMenu> 
    </s:span> 
    <s:span rendered="#{'specific' == webencode.requestType ? true : false}"> 
    <h:selectOneMenu value="#{webencode.arrVideoEncodings.get(0).videoEncoding}" 
     id="lstSpecificVideoEncoding1" style="width:295px;"> 
     <f:selectItems value="#{webencode.videoEncodingItems}"/> 
    </h:selectOneMenu> 
    </s:span> 
</a4j:outputPanel>    

<h:selectOneMenu value="#{webencode.inputMediaType}" 
    id="lstInputMediaType"> 
    <f:selectItems value="#{webencode.inputMediaTypeItems}"/> 
    <a4j:support ajaxSingle="true" event="onchange" reRender="media" process="lstSeriesName,lstSpecificVideoEncoding1"/> 
</h:selectOneMenu> 

<a4j:outputPanel id="media" ajaxRendered="true"> 
    <s:span rendered="#{'Tape Library # or Server ID #' == webencode.inputMediaType ? true : false}"> 
    <h:inputText id="txtLibraryServerNumber" 
     value="#{webencode.libraryServerNumber}" maxlength="50" /> 
    </s:span> 
    <s:span rendered="#{'Digital Media File Name' == webencode.inputMediaType ? true : false}"> 
    <h:inputText id="txtDigitalMediaFileName" 
     value="#{webencode.digitalMediaFileName}" maxlength="195" /><br /> 
    </s:span> 
</a4j:outputPanel> 

回答

0

找到了解決辦法:很奇怪,但服務器,這是運行Apache與JBoss,它需要有限於列表屬性設置爲true:

<a4j:support ajaxSingle="true" event="onchange" reRender="media" 
    limitToList="true"/> 

這確保只有指示的控件(在本例中爲「媒體」)纔會重新呈現。仍然不知道爲什麼它需要在服務器上,而不是在本地主機上。得到的東西與Apache和它如何與JBoss進行通信,但不知道。

1

如果將面板的UpdateMode屬性設置爲「always」,它將隨任何回發更新而發生。如果將其設置爲「有條件」,則只有在其中一個觸發器導致回發時纔會更新。

我不知道這是否會清除您的控件,但它是一個可能的答案,爲什麼一個面板是影響另一個。

+0

謝謝,hqrsie。不幸的是,RichFaces a4j:outputPanel控件上沒有UpdateMode。 – Alex

1

Webencode bean的範圍是什麼?這將不得不是頁面或更長的時間,或者您的價值將在每次通話中丟失。請記住,如果您未指定範圍,則默認爲請求,每個Ajax調用都是一個請求。

您的媒體面板一直在刷新,因爲您已經用ajaxRendered屬性指定了它,就好像在說「即使我沒有被要求重新修改,反正我總是這樣」。除非你有充分的理由使用ajaxRendered(例如,那些總是呈現狀態消息的東西),那麼你最好從明確開始指定reRender。

流程屬性在這裏是不必要的 - 擺脫它。

乾杯,

d

+0

謝謝,達摩。我從輸出面板中取出了ajaxRendered屬性。他們現在在我的本地主機上正常工作;但在運行相同版本的JBoss的服務器上,AJAX現在不做任何事情。很奇怪。 – Alex

+0

檢查您沒有任何嵌套表單。如果您使用Facelets,很容易意外。 – Damo

+0

我以前見過這個問題:看起來,如果您在頁面上有必填字段,並且您設置了ajaxRendered = false,則該面板將不會顯示。我可以讓面板顯示的唯一方法是將其設置爲true,當我這樣做時,它會清除其他面板中字段的值。 – Alex