2016-08-30 55 views
1

我正在嘗試使用sessionScope變量來存儲文檔ID以標識要從定義的數據源分配的文檔。
在beforePageLoad中,我創建了一個文檔集合並做了一個簡單的搜索。如果找不到文檔,則會創建一個新文檔,否則會加載現有文檔。一切都很好。
問題:當我完全或部分刷新頁面時,sessionScope變量設置爲null。儘管到處都有多個打印語句,但我無法找到發生的情況。許多互聯網搜索沒有產生信息。 這裏是我的代碼:使用sessionScope變量計算數據源 - 變量在部分刷新和全部刷新時設置爲空

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xp_1="http://www.ibm.com/xsp/coreex"> 
    <xp:this.beforePageLoad><![CDATA[#{javascript:sessionScope.ABBR="ASU"; 
sessionScope.uniSearchFormula = '@Contains(U_Abbr; "'+ sessionScope.ABBR + '")'; 
var checkExist:NotesDocumentCollection = database.search(sessionScope.uniSearchFormula); 
var docid:NotesDocument = checkExist.getFirstDocument(); 

if (docid == null) { 
    print("Creating New Document") 
    var docid = database.createDocument(); 
    docid.replaceItemValue("Form","University"); 
    docid.replaceItemValue("U_Abbr", sessionScope.ABBR); 
    docid.replaceItemValue("U_Name", sessionScope.UniversityName); 
    docid.replaceItemValue("U_ContactName","Meerkat Watson"); 
    docid.save(); 
} else { 
    print("Modifying Existing Document") 
    docid.replaceItemValue("U_ContactName","Meerkat Watson"); 
    docid.save(); 
} 
sessionScope.docid = docid;}]]></xp:this.beforePageLoad> 
    <xp:this.data> 
     <xp:dominoDocument var="UniversityDoc" formName="University" 
      action="editDocument" loaded="true" documentId="#{javascript:sessionScope.docid}"> 
     </xp:dominoDocument> 
    </xp:this.data> 
    <xp:panel id="ButtonPanel"> 
     <xp:div align="center"> 
      <xp:table> 
       <xp:tr> 
        <xp:td> 
         <xp:button id="button3" value="Refresh Page"> 
          <xp:eventHandler event="onclick" submit="true" 
           refreshMode="complete"> 
           <xp:this.action><![CDATA[#{javascript:context.reloadPage()}]]></xp:this.action> 
          </xp:eventHandler> 
         </xp:button> 
        </xp:td> 
        <xp:td align="center"> 
         <xp:button id="button2" value="Full Update"> 
          <xp:eventHandler event="onclick" submit="true" 
           refreshMode="complete"> 
          </xp:eventHandler> 
         </xp:button> 
        </xp:td> 
        <xp:td> 
         <xp:button id="button1" value="Partial Update"> 
          <xp:eventHandler event="onclick" submit="true" 
           refreshMode="partial" id="eventHandler2" refreshId="OutputPanel"> 
          </xp:eventHandler> 
         </xp:button> 
        </xp:td> 
       </xp:tr> 
      </xp:table> 
     </xp:div> 
    </xp:panel> 
    <xp:panel id="OutputPanel"> 
     <xp:div align="center"> 
      <xp:table> 
       <xp:tr> 
        <xp:td> 
         <xp:label value="sessionScope.docid = " id="label1"> 
         </xp:label> 
        </xp:td> 
        <xp:td> 
         <xp:label value="#{javascript:sessionScope.docid}" id="label11"> 
         </xp:label> 
        </xp:td> 
       </xp:tr> 
       <xp:tr> 
        <xp:td> 
         <xp:label id="label2" value="University Name"></xp:label> 
        </xp:td> 
        <xp:td> 
         <xp:text escape="true" id="computedField1" value="#{UniversityDoc.U_Name}"></xp:text> 
        </xp:td> 
       </xp:tr> 
       <xp:tr> 
        <xp:td> 
         <xp:label id="label3" value="University Abbr"></xp:label> 
        </xp:td> 
        <xp:td> 
         <xp:text escape="true" id="computedField2" value="#{UniversityDoc.U_Abbr}"></xp:text> 
        </xp:td> 
       </xp:tr> 
      </xp:table> 
     </xp:div> 
    </xp:panel> 
</xp:view> 

回答

-1

我還不知道有關「空」的一部分,但我不認爲你正在做正確。如果你有這樣一個綁定的數據源,我可能是錯的,但我認爲它是在一個空白的傳遞 - 然後它知道要創建一個新的文檔,如果它通過一個UNID然後它使用它。 假設我是正確的..我可能不會,但這將豆你不需要預先創建beforePageOpen文件。只要讓它爲你做,然後在保存中填寫任何缺失的字段。或者,如果你需要在屏幕上,只需從sessionScope中獲得它們即可。

我不知道你在做什麼搜索的東西。看起來像一個getDocumentByKey可能會更好,因爲你只是在尋找一個單一的文件。雖然老實說,我想知道你是否會更好地通過參數傳遞密鑰並使用它。

只是有些想法。不知道那裏是否有很好的答案。

+0

我認爲你有一些好的想法來改善代碼流。我將研究getDocumentbyKey並允許xpage創建文檔,而不是在beforePageLoad中執行。 –

+0

getDocumentbyKey。 –

0

這裏有幾個問題。您正在使用運行時計算(#{javascript:...}),因此每次部分刷新後都會重新計算documentId。使用${javascript:...}

沒有ignoreRequestParams="true"在數據源上設置,它從URL中獲取設置。由於網址中沒有任何內容,因此您每次都會收到一個新文檔。

這將解決創建問題,但是您可能會碰到一個問題,我可能會在今年年初的IBM Connect會話中討論這個問題。當連接到頂級XPage時,數據源在beforePageLoad運行之前得到計算- 它必須因爲沒有組件添加到組件樹中以將其綁定到組件。您將通過beforePageLoaddocumentId屬性中的打印語句確認此問題,然後查看服務器控制檯。將其放置在面板中並運行。爲了解決這個問題,把它放在面板裏面。如果它附加到自定義控件上,因爲自定義控件(通常)被放到另一個組件中,所以你很好。或者,在表單本身之外設置sessionScope變量。

請參閱我的幻燈片的Twin Pines Mall/Lone Pine Mall部分http://www.slideshare.net/paulswithers1/ad1279-marty-youre-not-thinking-fourth-dimensionally-troubleshooting-xpages。恐怕你已經擊中了該部分所涉及的大部分陷阱。

+0

感謝您對ignoreRequestParams屬性的解釋 - 我將確保它設置爲true。 –

+0

我通過我的許多印刷聲明注意到,documentid被計算了很多。問題:#{javascript}是運行時計算 - 什麼是$ {javascript:}?我沒有聽說過運行時#與$。我一定會仔細閱讀您的演示文稿的指針。至少這些指針我可以理解,但仍然有限的xpages編程知識。:>) –

+0

'$ {javascript:...}'只在頁面加載時運行一次。如果頁面加載後不需要更改該值,則性能會更好。 –

1

我辦公室裏一位更有經驗的同事幫助我思考了這一點。我得到的聲明文檔如下: var doc:NotesDocument = checkExist.getFirstDocument(); 這將返回一個類型lotus.domino.local.Document。

我需要使用 var docid = doc.getUniversalID() 以獲取UNID,xpage可以使用它來查找返回的文檔,它是typeof字符串。

看來,一個是一個指針,另一個是實際的文檔,但兩者的值是相同的。只是類型是不同的。這是我仍然試圖包裹我的頭,特別是因爲一旦我設置sessionScope.docid = docid,sessionScope.docid返回一個typeof undefined .....

但它現在工作。

+0

類似於有前端和後端文檔的LotusScript。 XPages中存在相同的概念,其中有一個與前端UIDocument類似的XSPDocument。 –

+0

如果您需要更多的基礎信息,那麼在網站XPages.TV上有大約199個關於XPage的節目。它是NotesIn9視頻的集合。大約94小時的信息 - 但很多早期的信息都很短,可能對您有所幫助。 –

+0

感謝大衛 - 我觀看了很多NotesIn9視頻,並且會確保我查看一些早期的視頻。我的學習曲線面臨的一個挑戰是,在Xpages之前,我從來沒有在Notes中開發過,而且我對LotusScript的瞭解非常有限。我有一個相當數量的shell腳本和mysql查詢作爲系統管理員從我過去的工作知識。但是,直到1年半以前我開始從事這項工作之前,沒有真正的網絡編程。 –