2012-09-18 41 views
1

我有這個頁面:RichFaces的使用多種形式與A4J:阿賈克斯

 <h:head></h:head> 
    <h:body> 
     <h:form id="someForm"> 
      Form is here 
     </h:form> 
     <h:form> 
      <a4j:commandButton id="editButton" value="editSomeString" 
          execute="@this" 
          action="#{testBean.edit('afterEdit')}" 
          oncomplete="#{rich:component('editPanel')}.show()" 
          render="editPanel"/> 
      <rich:popupPanel modal="true" id="editPanel" autosized="true" 
          domElementAttachment="form"> 
       <f:facet name="controls"> 
        <a4j:ajax event="show" oncomplete="alert('#{testBean.someString}')" /> 
       </f:facet> 
       Changed value is   
       #{testBean.someString} 
      </rich:popupPanel> 
     </h:form> 
    </h:body> 

有了這個bean:

@ViewScoped 
@ManagedBean(name = "testBean") 
public class TestBean implements Serializable { 

public TestBean() { 
    someString = "initValue"; 
} 
private String someString; 


public String getSomeString() { 
    return someString; 
} 


public void setSomeString(String someString) { 
    this.someString = someString; 
} 


public void edit(String value) { 
    someString = value; 
} 

}

現在,如果我在彈出的點擊按鈕,我將有正確的值(afterEdit)和警報框中的舊值(initValue)。 如果我刪除第一個表單(id = someForm)或將bean範圍更改爲會話,它會工作得很好(afterEdit值顯示在警告框中)。 任何想法正在發生什麼?

我用這種依存關係JSF:與RichFaces的4.0.0.Final和GlassFish Server開源版3.1.2沿

 <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-api</artifactId> 
     <version>2.1.1-b04</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-impl</artifactId> 
     <version>2.1.1-b04</version> 
     <scope>compile</scope> 
    </dependency> 

(建立23)

同一頁的另一個變化(onhide並添加OnShow中的方法)

<h:head></h:head> 
    <h:body> 
     <h:form id="someForm"> 
      Form is here 
     </h:form> 
     <h:form> 
      <a4j:commandButton id="editButton" value="go" 
          execute="@this" 
          action="#{testBean.edit('afterEdit')}" 
          oncomplete="#{rich:component('editPanel')}.show()" 
          render="editPanel,y"/> 
      <rich:popupPanel modal="true" id="editPanel" autosized="true" 
          styleClass="taskEditPanel" domElementAttachment="form" onhide="alert('from on hide #{testBean.someString}')" onshow="alert('from on show #{testBean.someString}')"> 
       <f:facet name="controls"> 
        <a4j:ajax event="show" oncomplete="alert('show complete #{testBean.someString}')" /> 
        <a4j:ajax event="hide" oncomplete="alert('hide complete #{testBean.someString}')"/> 
       </f:facet> 
       Changed value is   
       #{testBean.someString} 
       <a4j:commandButton id="exitButton" value="exit" 
          execute="@this" 
          oncomplete="#{rich:component('editPanel')}.hide()" 
          /> 
      </rich:popupPanel> 
     </h:form> 
    </h:body> 

如果試圖打開和關閉彈出這些警報顯示:

  1. 「從節目afterEdit」
  2. 「顯示完整initValue」
  3. 「從隱藏afterEdit」
  4. 「隱藏完整initValue」

所以看起來A4J:阿賈克斯獲得價值從彈出的方法以外的其他地方? 這是ViewState問題嗎?有兩個隱藏的javax.faces.ViewState字段,它們具有相同的id和不同的值。它們代表整個視圖的狀態,還是隻包含它們的形式?如果整個視圖這兩個字段應該具有相同的值,並且可能是a4j:ajax正在從未更新的第一個窗體查看視圖狀態? 上的任何資源鏈接如何視圖狀態的處理?它代表將是巨大的(即使視圖狀態不是這裏的情況)

回答

1

你可以嘗試使用相同的形式和a4j:region到separatte不同形式,因爲jsf不喜歡更新其他表格,因爲他們的狀態不會發送到服務器 當您使用sessionScope時,狀態被保存在服務器中,使其成爲可能,但它不是真正的web應用程序的最佳解決方案

+0

感謝回答。我知道,使用區域的一種形式將會很好,而且已經解決了這個問題。但我想知道究竟是什麼造成了這個問題。由於這兩種形式不會互相影響(我嘗試在a4j上添加渲染:ajax以確保不會重新渲染第一種形式),爲什麼會發生? –

+1

問題很簡單,當一個表單被引用到服務器時,它會與他的組件id一起使服務器獲得表單的視圖,該表單會發送請求,所以如果您嘗試更新該表單之外的值將簡單地被忽略,一種解決方案是將其他形式包含在命令按鈕或鏈接的執行參數中,但值將被髮送到,其他解決方案是調用另一個窗體中按鈕的按鈕javascript – rekiem87

+0

而我知道,這是非常傷心的,我不得不多次使用這個javascript解決方案,但它看起來沒有其他方式,因爲是jsf 2的工作方式,它計劃使用一種形式...和許多其他美麗的東西,你會發現 – rekiem87