2012-03-16 58 views
2

我有,我想創建一個新版本/副本的文件,所以我試圖做服務器端JavaScriptXpages-創建保存的文檔的新副本,打開它,但不保存

  • 創建一個新文檔
  • 拷貝從當前文檔
  • 打開我創建了新的文件,所有的項目,但不保存

我無法打開新創建的文檔,這可能嗎?我使用

代碼:

var viewPanel=getComponent("viewPanel1");get the componet of viewPanel 
var docIDArray=viewPanel.getSelectedIds(); get the array of document ids 
for(i=0;i < docIDArray.length; i++){ 
    var docId=docIDArray[i]; 
    var doc=database.getDocumentByID(docId); 
    var newDoc = database.CreateDocument 
    doc.CopyAllItems (newDoc) 
    var docUNID = newDoc.getUniversalID() 
    // need something here to open copied document 
} 
+0

由於新的文檔沒有保存它沒有一個通用的ID。因此,當然,因爲它在數據庫中還沒有被激發,所以不能簡單地將docunid als返回給筆記文檔數據源。 – jjtbsomhorst 2012-03-16 21:36:21

+0

當你說你想打開文檔時,你的意思是你想在XPage中編輯文檔嗎?您是否想要在當前打開的文檔的相同上下文(頁面)中編輯它,或者您是否希望在新的XPage視圖中打開它? – 2012-03-17 14:52:59

+0

你想如何打開多個文件?每個人都在自己的標籤頁/窗口中? – 2012-03-19 08:01:05

回答

0

你可以保存這些文件,然後告訴他們,並通過對這些文檔標記字段將它們添加到刪除隊列。在保存時將它們從刪除隊列中刪除可能是一種解決方法。

2

您需要的ID存儲在會話範圍,然後打開網頁,並在數據源事件之一里面做的副本:您希望有新的

var viewPanel=getComponent("viewPanel1");get the componet of viewPanel 
var docIDArray=viewPanel.getSelectedIds(); get the array of document ids 
sessionScope.alltheDocs = docIDArray; 

然後打開網頁文件。在該頁面中,您需要有一個重複控件,以匹配所有Docs的元素數量。我可能會使用DojoTab容器來設計它(每個文檔一個選項卡)。在重複內部放置一個帶有數據源(或自定義控件)的面板。然後在queryNewDocument事件中使用數據源的變量名稱複製字段。

+0

嗨,傑里米。是的,我想在編輯模式下打開新文檔。至於我想如何讓它工作將從視圖中選擇文檔,單擊一個按鈕(創建新版本),這將創建一個新的複製(不必保存)所選文檔並在編輯模式下打開 – 2012-03-18 20:58:05

+0

jarnail - 選擇多個文檔時會發生什麼?你想每個創建一個新文檔? – stwissel 2012-03-19 12:50:08

+0

理想的解決方案(並保持簡單)將是客戶端JavaScript會檢查只有一個可以選擇(我不知道是否會成爲可能,因爲我沒有找到任何關於viewpannel的客戶端JavaScript代碼)。選擇文檔後,我將創建新副本。感謝所有迄今爲止的迴應 – 2012-03-19 20:05:24

0

1)不要將Notes對象存儲到持續時間比請求長的作用域。 2)如果XPage必須繼承某些值,則需要從某個源讀取它們。

3)不能從Notes文檔繼承數據 - 根據(1)中的內存對象不能存儲在sessionScope中(在兩個頁面之間傳遞對象的最簡單方式),並且無法通過UNID/key檢索它(不按要求保存)。

所以,(可能)唯一的選擇是:源文件的

製作副本 - 複製每一個領域你有興趣到地圖[字符串,對象。必須將字段轉換爲「原始」對象String,Double,Date(java,not Notes)或其多值向量。您不得複製特殊(Notes對象)字段 - 名稱,日期,富文本!名稱可以轉換爲字符串,日期可以檢索爲Java日期,富文本可能被視爲MIME(字符串)(但可能會丟失格式)。我想你不想傳遞附件。

在目標XPage中,定義queryNewDocument事件以從該Map對象中查找和初始化字段。刪除sessionScope對象以防止重複。

+0

其實你可以繼承經典的Domino你必須與parentUNID =上creatio! n和「繼承選定文檔的值」。 AFAIK也適用於XPages。你可能需要設置「用表單計算」 – stwissel 2012-03-19 12:51:25

+0

你是對的。我認爲Jarnail的請求是從內存文件繼承(這是他的方法 - 在內存文件中準備並將它們傳遞給xpage)。我錯過了詳細信息,他在文檔中選擇了文檔 - 因此他可以通過onNewDocument事件或computeWithForm輕鬆繼承必需的字段 – 2012-03-20 15:01:18

0

我的應用程序需要非常類似的東西。我有一個在閱讀模式下打開源文檔的XPage。有一個按鈕用於創建新文檔並設置少量值(使用源文檔)。我希望XPage在創建後以編輯模式打開這個新文檔。 注意:我無法在URL參數操作中使用重定向,因爲我需要在同一個XPage中將其打開並保留視圖範圍變量和bean。

解決方案:

  1. 添加視圖範圍變量NewDocAction和documentId(上按一下按鈕),
  2. 的XPage的局部刷新(按鈕)
  3. 計算文檔數據源使用viewScope可變documentId
  4. 檢查是否存在視圖範圍變量NewDocAction(在onClienLoad事件中)

javascri PT代碼按鈕:

var travelDoc = xpBean.createTravelDoc(requestDoc); 
if (travelDoc != null){ 
    viewScope.put("content","travelForm"); //to render proper CC on XPage 
    viewScope.put("documentId", travelDoc.getUniversalID()); 
    viewScope.put("NewDocAction", "ToEditMode"); 
} 

在travelForm自定義控件的onClientLoad事件的JavaScript代碼:

if (viewScope.containsKey("NewDocAction") && viewScope.get("NewDocAction").equals("ToEditMode")){ 
    context.setDocumentMode("travelDoc","edit"); 
    viewScope.remove("NewDocAction"); 
}