Xpages-创建已保存文档的新副本并在不保存的情况下将其打开

时间:2012-03-16 20:31:21

标签: xpages

我有一个文档,我想创建一个新的版本/副本,所以我试图做服务器端的javascript到

  • 创建新文档
  • 复制当前文档中的所有项目
  • 打开我创建的新文档,而不保存

我无法打开新创建的文档,这可能吗?

我正在使用的代码是:

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
}

4 个答案:

答案 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事件中,使用数据源的变量名复制字段。

答案 1 :(得分:0)

您可以保存这些文档,然后通过在这些文档上标记字段来显示它们并将它们添加到删除队列中。在保存时,可以将它们从删除队列中删除,作为可能的解决方法。

答案 2 :(得分:0)

1)不要将Notes对象存储到持续时间超过请求的范围。

2)如果XPage必须继承某些值,则需要从某些来源读取它们。

3)你不能从Notes文档继承数据 - 根据(1),在内存对象中不能存储在sessionScope中(最简单的方法是在两个页面之间传递对象),而你无法通过UNID / key检索它(它没有按照要求保存。)

所以,(可能)唯一的选择是:

制作源文档的副本 - 将您感兴趣的每个字段复制到Map [String,Object]中。字段必须转换为&#34; raw&#34;对象String,Double,Date(java,not Notes)或它们的多值向量。您不能复制特殊(Notes对象)字段 - 名称,日期,富文本!名称可以转换为字符串,日期可以作为Java日期检索,富文本可以被视为MIME(字符串)(但可能会丢失格式)。我想你不想传递附件。

在target XPage中,定义queryNewDocument事件以查找并初始化此Map对象中的字段。删除sessionScope对象以防止重复。

答案 3 :(得分:0)

我的申请中需要非常相似的东西。我有XPage,在读取模式下打开了源文档。有一个按钮可以创建一个新文档并设置一些值(使用源文档)。我希望XPage在创建后以编辑模式打开这个新文档。 注意:我无法使用带有URL参数操作的重定向,因为我需要在同一个XPage中打开它并保留视图范围变量和bean。

解决方案:

  1. 添加视图范围变量NewDocAction和documentId(按钮单击),
  2. 部分刷新XPage(在按钮上)
  3. 使用viewScope变量documentId
  4. 计算文档数据源
  5. 检查View Scope变量NewDocAction的存在(在onClienLoad事件中)
  6. 按钮中的javascript代码:

    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");
    }