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

Xpages-创建已保存文档的新副本,并在不保存的情况下打开它,xpages,Xpages,我有一个文档,我想创建一个新版本/副本,所以我正在尝试使用服务器端javascript 创建新文档 复制当前文档中的所有项目 打开我创建的新文档,但不保存它 我无法打开新创建的文档,这可能吗 我使用的代码是: var viewPanel=getComponent("viewPanel1");get the componet of viewPanel var docIDArray=viewPanel.getSelectedIds(); get the array of document ids

我有一个文档,我想创建一个新版本/副本,所以我正在尝试使用服务器端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
}
var viewPanel=getComponent(“viewPanel1”);获取viewPanel的组件
var docIDArray=viewPanel.getSelectedIds();获取文档ID的数组
对于(i=0;i
您可以保存这些文档,然后显示它们,并通过在这些文档上标记字段将它们添加到删除队列中。在保存时,将其从删除队列中删除,作为一种可能的解决方法。

您需要将ID存储在会话范围中,然后打开页面并在其中一个数据源事件中进行内部复制:

var viewPanel=getComponent("viewPanel1");get the componet of viewPanel
var docIDArray=viewPanel.getSelectedIds(); get the array of document ids
sessionScope.alltheDocs = docIDArray;
然后打开您想要保存新文档的页面。在该页面中,您需要有一个与所有DOC的元素计数相匹配的repeat控件。我可能会使用DojoTab容器(每个文档一个选项卡)来设计它。在“重复”对话框中,放置一个带有数据源(或自定义控件)的面板。然后,在queryNewDocument事件中,使用数据源的变量名复制字段。

1)不要将Notes对象存储到作用域,其持续时间超过请求的时间

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

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

因此,(可能)唯一的选择是:

复制源文档-将您感兴趣的每个字段复制到Map[String,Object]中。字段必须转换为“原始”对象字符串、双精度、日期(java,而不是Notes)或其多值向量。您不能复制特殊(注释对象)字段-名称、日期、富文本!名称可以转换为字符串,日期可以作为Java日期检索,富文本可以作为MIME(字符串)处理(但可能会丢失格式)。我想你不想传递附件


在目标XPage中,定义queryNewDocument事件以查找和初始化此映射对象中的字段。删除sessionScope对象以防止重复。

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

解决方案:

  • 添加视图范围变量NewDocAction和documentId(单击按钮)
  • 部分刷新XPage(打开按钮)
  • 使用viewScope变量documentId计算文档数据源
  • 检查是否存在视图范围变量NewDocAction(在OnClientLoad事件中)
  • 按钮中的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自定义控件的OnClient加载事件中的javascript代码:

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

    由于新文档未保存,因此它没有通用ID。因此,当然,由于它尚未在数据库中显示,您不能简单地将文档ID作为notes文档数据源的unid返回。当您说要打开文档时,您的意思是要在XPage中编辑文档吗?您想在与当前打开的文档相同的上下文(页面)中编辑它,还是想在新的XPage视图中打开它?您想如何打开多个文档?每个人都有自己的标签/窗口?嗨,杰里米。是的,我想在编辑模式下打开新文档。至于我希望如何使其工作,请从视图中选择文档,单击按钮(创建新版本),该按钮将创建新副本(无需保存)在编辑模式下打开所选文档的链接-选择多个文档时会发生什么情况?您希望每个文档创建一个新文档吗?理想的解决方案(并保持简单)是客户端javascript检查是否只能选择一个文档(我不知道是否可能,因为我还没有找到任何关于viewpannel的客户端javascript代码)。在文档上选择后,我将创建新副本。感谢到目前为止的所有回复:选择一个元素的UI不是复选框。这是一个单选按钮。如果您自动取消选中复选框(您可以用一些JS来实现这一点),用户会感到困惑。缺点:您需要创建自己的视图控件(例如,通过使用repeat控件)。但是你需要这两个步骤吗?(有充分的理由,所以这是一个真实的问题)。你可以构造一个以unid为参数的链接,并在空xpage的“你打开的页面”事件中读取。Hi Stwissel:不确定你的意思是什么,也不确定“在空xpage的“你打开的页面”事件中如何读取”,这会创建一个新文档还是打开并现有文档?实际上你可以继承!在经典Domino中,您在创建和“从所选文档继承值”时拥有&parentUNID=。AFAIK也在XPages中工作。如果您是对的,您可能需要设置“使用表单计算”。我认为Jarnail的请求是从内存中继承文档(这是他的方法——准备内存中的文档并将它们传递给xpage)。我错过了细节,他在视图中选择了文档-因此他可以通过onNewDocument事件或com轻松继承必填字段