2015-09-17 69 views
1

我們有一些手風琴頁面。一些手風琴開始時是空的,當用戶通過部分更新點擊手風琴欄時,手風琴會被填滿。在開始時,這可以正常工作,但如果用戶在稍後階段打開手風琴,則不起作用。XPages:丟失viewScoped bean(再次)

它發生在用戶離開手風琴時關閉,切換到不同的頁面在相同的NSF,做了很多事情,然後回到第一頁。不知何故,與部分刷新相關的代碼不會被執行。

下面是一些代碼:

<xe:djAccordionPane id="djAccordionPane3"> 
    <xp:div id="outerPanelModels"> 
     <xc:ccModelView> 
      <xc:this.rendered><![CDATA[#{javascript:UserData.getVar("ShowModels")}]]></xc:this.rendered> 
     </xc:ccModelView> 
    </xp:div> 
    <xe:this.dojoAttributes> 
     <xp:dojoAttribute name="Title" value="#{javascript:constants.Models}"></xp:dojoAttribute> 
    </xe:this.dojoAttributes> 
    <xp:eventHandler event="onShow" submit="true" refreshMode="partial" 
     refreshId="outerPanelModels"> 
     <xp:this.onComplete><![CDATA[hideAjaxLoader();]]></xp:this.onComplete> 
     <xe:this.script><![CDATA[if(document.getElementById("#{id:outerPanelModels}").childElementCount==0) { 
    showAjaxLoader(); 
    return true 
} 
return false;]]></xe:this.script> 
     <xe:this.action><![CDATA[#{javascript:UserData.putVar("ShowModels", true)}]]></xe:this.action> 
    </xp:eventHandler> 
</xe:djAccordionPane> 

的UserData是一個sessionScope豆。 putVar和getVar曾經​​是一個viewScope bean,我猜想bean會以某種方式被銷燬(實際上是這樣),所以我將代碼移到了sessionScope中。

爲什麼不執行底部的代碼行,即UserData.putVar(「ShowModels」,true)的行?任何線索?解決辦法可能是?

謝謝!

更新 將應用程序設置爲將所有頁面保留在內存中。

xsp.properties:

xsp.error.page=xError.xsp 
xsp.library.depends=com.ibm.xsp.extlib.library 
xsp.min.version=8.5.3 
xsp.persistence.mode=basic 
xsp.resources.aggregate=false 
xsp.theme.web=extendOneUI.theme 

xsp.openlog.expireDate=15 

xsp.error.page=Error.xsp 
xsp.persistence.viewstate=fullstate 
# org.openntf.domino.xsp=godmode,marcel,bubbleExceptions 
xsp.application.forcefullrefresh=true 
xsp.error.page.default=true 
xsp.session.timeout=180 
xsp.application.timeout=180 
+0

您確定該行沒有執行嗎?您是否向該方法添加了打印語句,然後檢查控制檯以驗證? –

+0

putVar做的第一件事是在(內部)日誌中添加一行。該日誌可以在單獨的屏幕上檢查。空空如也。部分刷新確實發生了,實際上,這只是代碼不被執行。如果你想我添加一個System.out.print,我會這樣做,只是爲了確保。 –

+0

只有當this.script中的客戶端代碼返回true時,纔會運行this.action中的服務器端代碼。你期望它每次都運行嗎? –

回答

1

評論xsp.properties,特別是持久性屬性的頁數,以保持在內存中,並保存在磁盤上。還有默認設置。

一旦存儲了一定數量的組件樹,如果嘗試存儲另一個組件樹,則最早將被轉儲。在你描述的場景中,它聽起來像是在用轉折的UserData viewScoped變量轉儲頁面的組件樹。

沒有神奇的答案,它將取決於您的應用程序以及用戶如何與它進行交互。這也取決於你是否將所有頁面保存在內存中,全部保存在磁盤上還是混合內容中。基本上,如果允許用戶在瀏覽器中打開同一NSF的其他選項卡,除非可以保留該頁面的組件樹,否則組件樹可能會丟失,因爲服務器端無法知道它是仍然在瀏覽器中打開。

+0

我更新了上面的問題文本:所有頁面都保存在內存中。我知道舊頁面會被甩掉,但是多少會被甩掉?只有記憶?甚至應該調用的函數?爲什麼不正確的頁面重新加載,爲什麼不調用該函數?它執行一些功能,我們可以在日誌中看到。奇怪的是:每次手風琴重新打開時,我都會重新創建viewScoped bean(我記錄了這個bean的創建)。該應用程序本身有一些5幀和iframe,加上爲每個打開的文檔一個單獨的窗口。很多頁面,我知道... –

+0

頁面的整個組件樹將被傾倒。這包括您嘗試呼叫的該頁面上的任何事件處理程序。 (事件處理程序中的任何SSJS代碼都不是函數,它是一個存儲在事件處理程序屬性中的字符串,如果爲特定事件調用該事件處理程序,則在INVOKE APPLICATION階段解析該字符串。)任何部分刷新(POST,即)是RESTORE VIEW階段。如果沒有任何東西可以恢復,因爲它已經被轉儲了,所以它不能再進一步了,所以它不會進入INVOKE APPLICATION階段來運行任何SSJS。 –

+0

我能做些什麼?我如何防止特定頁面被破壞?這是我們的主要儀表板頁面,它不應該死在用戶身上。或者在某種程度上可能發現viewScope在適當的時候丟失了,所以我可以重新創建頁面或重新打開它? –