2010-03-30 77 views
2

我有一個父頁面parentManagedBean(附加到會話範圍)。點擊這個父頁面上的一個按鈕,彈出一個彈出框,其中有一個childManagedBean(附加到請求範圍)。JSF以編程方式呈現響應

現在ChildManagedBean通過JSF託管的物業設施持有對parentManaged bean的引用。在這個彈出窗口中,用戶選擇填充大值對象的某個選項。我使用childManagedBean的託管屬性將此大對象的值設置爲parentManagedBean

問題是 - 父頁面顯示一個鏈接,點擊一個彈出窗口,選擇彈出窗口,彈出消失並將值設置爲parentManaged bean。到目前爲止這麼好,但新設置的值需要出現在父頁面上。這是我卡住的地方。如何以編程方式呈現母版頁/呈現頁面,當我在子託管bean?有沒有辦法可以處理父頁面並刷新它?

注:我使用的是JSF 1.1

編輯 -

下面的「重新提交-ING形式」從JavaScript,我看到了舊的形式也越來越重新提交其覆蓋所有的解決方案後,我改變的價值觀。我發現現在是 - 如果我發出一個GET請求,意思就是在子窗口關閉後,如果我進入主窗口並且只需在地址上按回車鍵(發出GET請求我相信),更新的價值 - 更新的價值回來。 所以這裏的重點是 - 如何使用JavaScript發出獲取請求,或者是否有通過JSF做到這一點的更好方法?

回答

2

我有一些類似的情況,我用javascript觸發了父頁面的刷新。

兒童

當用戶點擊「保存」,在彈出的行動被提交到與POST,其中更新父bean的孩子,然後用一些JavaScript重新顯示子頁:

window.opener.doRefresh(); 
window.close(); 

這給人的錯覺是,當用戶點擊「保存」時,彈出窗口直接關閉。你可以在你的案例中使用類似的技巧。

家長

function doRefresh() 
{ 
    if(document.forms[0].onsubmit) 
    { 
     document.forms[0].submit(); 
    } 
} 

function openChild() 
{ 
    window.open("path_to_child.jsf","_blank",""); 
    return false; 
} 

如果我記得很清楚,我無法使用location.reload刷新頁面。因爲reload可能會重新提交一箇舊表單,或者因爲它發出了JSF不太喜歡的GET請求。所以我提交了形式programmaticaly。這基本上達到了相同的效果。

這個解決方案不是優雅的傑作,但是,它對我很有用:)

+0

小心'document.forms [0]'。因爲文檔可以有多個表單,所以更喜歡'document.formname'。 – BalusC 2010-03-30 11:26:22

+0

非常感謝您的回覆。 我按照您的解釋嘗試瞭解決方案。不幸的是,我看到document.forms ['name']。submit()實際上是提交舊錶單,所以無論我從子頁面更新哪些值並被覆蓋。還有其他技術嗎? – Shamik 2010-03-30 14:10:31

+0

然後用'window.location.reload'嘗試一下,我認爲它會發出一個GET請求。否則,您可以嘗試使用第二種形式(內部無控制),僅用於刷新。當第二個表單被POST時,沒有數據被髮送,所以它不應該覆蓋更新的數據。但這真的很黑,我甚至不知道它是否有效。 – ewernli 2010-03-30 16:15:24