我有這個頁面: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>
如果試圖打開和關閉彈出這些警報顯示:
- 「從節目afterEdit」
- 「顯示完整initValue」
- 「從隱藏afterEdit」
- 「隱藏完整initValue」
所以看起來A4J:阿賈克斯獲得價值從彈出的方法以外的其他地方? 這是ViewState問題嗎?有兩個隱藏的javax.faces.ViewState字段,它們具有相同的id和不同的值。它們代表整個視圖的狀態,還是隻包含它們的形式?如果整個視圖這兩個字段應該具有相同的值,並且可能是a4j:ajax正在從未更新的第一個窗體查看視圖狀態? 上的任何資源鏈接如何視圖狀態的處理?它代表將是巨大的(即使視圖狀態不是這裏的情況)
感謝回答。我知道,使用區域的一種形式將會很好,而且已經解決了這個問題。但我想知道究竟是什麼造成了這個問題。由於這兩種形式不會互相影響(我嘗試在a4j上添加渲染:ajax以確保不會重新渲染第一種形式),爲什麼會發生? –
問題很簡單,當一個表單被引用到服務器時,它會與他的組件id一起使服務器獲得表單的視圖,該表單會發送請求,所以如果您嘗試更新該表單之外的值將簡單地被忽略,一種解決方案是將其他形式包含在命令按鈕或鏈接的執行參數中,但值將被髮送到,其他解決方案是調用另一個窗體中按鈕的按鈕javascript – rekiem87
而我知道,這是非常傷心的,我不得不多次使用這個javascript解決方案,但它看起來沒有其他方式,因爲是jsf 2的工作方式,它計劃使用一種形式...和許多其他美麗的東西,你會發現 – rekiem87