2014-02-28 48 views
0

當我嘗試將NotesXSPDocument傳遞給代理與runWithDocumentContext操縱一些字段,我從來沒有得到前端字段的新值。我嘗試了fullrefresh和partialrefresh。當我只打印字段值時,我成功地獲得了更改。NotesXSPDocument與代理runWithDocumentContext

這裏是一個XPage

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> 

    <xp:panel id="thePanel"> 
     <xp:this.data> 
      <xp:dominoDocument var="document" formName="from"></xp:dominoDocument> 
     </xp:this.data> 
     <xp:button value="Label" id="button1"> 
      <xp:eventHandler event="onclick" submit="true" 
       refreshMode="partial" refreshId="thePanel"> 
       <xp:this.action><![CDATA[#{javascript: 
var agent = database.getAgent("test"); 
agent.runWithDocumentContext(document.getDocument()); 
print("Value-->" + document.getDocument().getItemValueString("InMemReturn"));}]]> 
       </xp:this.action> 
      </xp:eventHandler> 
     </xp:button> 

     <xp:br></xp:br> 
     <xp:br></xp:br> 
     <xp:inputText id="inputText1" value="#{document.InMemReturn}"></xp:inputText> 
    </xp:panel> 

</xp:view> 

這裏的一個例子是代理

Option Public 
Option Declare 


Sub Initialize 

Dim session As New NotesSession 
Dim doc As NotesDocument 

Set doc = session.Documentcontext 
doc.Appenditemvalue "InMemReturn", CStr(Now) 

End Sub 

我錯過了什麼?

+0

是的。輸入字段將覆蓋返回值。將其更改爲計算字段,然後再試一次 – stwissel

+0

但我需要輸入字段。代理運行之後,我可能不得不通過runWithDocumentContext更改文檔 – Pudelduscher

回答

3

操縱鍵接輸入字段代理文件是棘手。 XPage運行時並不知道代理正在做什麼。通常情況下,您最好將代理轉換爲Java bean並調用該代理。它使您有機會清理代碼並優化性能。它還消除了爲操作加載代理運行時的性能損失。 「我想重複使用現有的代碼」在這裏經常被高估...

但是你問......所以我們走了。本文檔建議您可以使用

agent.runWithDocumentContext(document.getDocument(true)); 

確保應用後端更改。嘗試一下,讓我們知道它是如何去的。實際上,我會採取一種稍微不同的方法,並將輸入字段綁定到視圖變量,並將其寫入保存事件。喜歡的東西:

<xp:inputText id="inputText1" value="#{viewScope.InMemReturn}"></xp:inputText> 

,並在您的SSJS:

 var agent = database.getAgent("test"); 
    var doc = document.getDocument(true); 
    agent.runWithDocumentContext(doc); 
    viewScope.InMemReturn = doc.getItemValueString("InMemReturn"); 

,並在QuerySave的事件:

 document.getDocument().replaceItemValue("InMemReturn",viewScope.InMemReturn); 

讓我們知道如何去。

+0

謝謝。我知道使用代理不是一個好的解決方案。但我必須嘗試將很多現有的業務邏輯(lotusscript)轉換爲xpages應用程序。您的解決方案有效,但我的代理人有時會操縱更多80個字段,而且字段並不總是相同。如果這是唯一可行的解​​決方案,我寧願將代碼轉換爲java。我很想看到像notesxspdocument.syncWithNotesDocument(notesdocument)或類似的東西:) – Pudelduscher

+1

我覺得你的痛苦。對於多個字段,你可以使用一個輔助bean。這個bean實現了Map接口。它從Doc加載值,並綁定到它。在調用代理之前,您將值寫入文檔並在調用回bean之後。使用內部映射這是通用的。使用這個bean作爲對象數據源。並隨時接受答案 – stwissel

+0

聽起來像一個計劃。再次感謝你的幫助。 – Pudelduscher

-1

你不保存文檔中的代理

 Call Doc.save(false,true,false) 
+1

中的值,您不必保存文檔。但我試過保存,它也不起作用 – Pudelduscher