0

我正在努力解决以下问题。

在我的 XPage 上,我有一个 viewpanel 组件,但它没有绑定到 notesview 数据源,而是绑定到存储在 viewScope 中的 hashmap。原因超出了我的问题范围。

由于我视图中的行实际上并未链接到文档,因此我无法使用标准复选框和相关的 getSelectedDocIds。但是,我确实想要一种删除所选文档的方法。我有一列带有复选框,其中包含相应行的unid。

长话短说。我有一个 unid 数组,并且想要执行执行以下操作的操作:

  • 显示一个 dijit.Dialog 要求确认
  • 如果单击确定,则调用执行以下操作的函数:
    • 删除基于unid的文档
    • 刷新视面板

我正在考虑以下两种解决方案,但怀疑什么是最好的(也许是第三种,甚至更简单的解决方案?)

  1. 让 dojo 对话框的 OK 按钮调用一个对 XAgent 或普通旧 LS 代理执行 XmlHttpRequest 的函数

  2. 如 JeremyHodge 所述,让 OK 按钮触发在服务器上运行的事件处理程序。但是我将如何将 unids 作为参数传递并在之后刷新视图?

谢谢!

4

3 回答 3

1

你不能只使用带有对话框按钮控件的扩展库对话框。在此按钮控件中,您可以

第三种选择是在包含复选框的数据表/视图中添加一列。在这些框的 onchange 事件中,您添加一个事件处理程序,它将值添加到 viewScope 变量。

页面底部(或顶部)的一个按钮,您添加从哈希图中删除所选项目所需的代码,删除与所选 ID 关联的文档。这个按钮可以是一个普通的按钮,在视图面板上进行部分刷新。当您遇到无法在对话框中使用按钮的错误时,请使用扩展库对话框控件,因为这可以为您解决该问题。

如果当前用户没有正确的访问级别来删除文档,您可以使用 sessionAsSigner 全局(假设设计元素的签名者具有正确的访问级别)。

这样您就不需要通过 xmlthttprequest 调用 xAgent 并且可以使用默认的 xpage 方法。

我希望这在某种程度上有所帮助

于 2012-07-25T20:32:15.547 回答
1

我会第二个@jjbsomhorst 使用对话框的扩展库 - 如果你使用一个的话。通常用户不会阅读对话框。因此,该方法将添加带有复选框的列,但不要打扰事件处理程序,而是将它们全部绑定到 ONE scopeVariable。在提交时,该变量将保存一个具有所选 UNID 的数组。然后呈现一个列出这些文档并有一个确认按钮的页面。虽然新页面提供了服务器往返的可能性,但用户实际关注的可能性要高得多。你可以做什么:

拥有呈现带有可编辑复选框的对话框的普通页面,当用户单击“删除”时,您设置类似的内容viewScope.confirmDeleteMode=true;并将其用作复选框的条件并将它们设置为只读并将所选行的类设置为“morituri”在你的 CSS 中会有类似的东西.morituri { color: white; background-color : red; font-weight: bold } 和一个新按钮“确认删除”(并隐藏删除按钮)。

这样,您只需处理一页。

于 2012-07-26T03:16:58.920 回答
1

我选择了选项 2,它可以提供部分刷新 id。我将unids作为提交值传递,例如:

function doRemove(unids){

     XSP.executeOnServer(ISP.UI.removeEventID, ISP.UI.removeRefreshID, {

        params: {
            '$$xspsubmitvalue': unids
        },
        onComplete : function() {
            //alert('test')
        }
    });

}

ISP.UI.removeEventID 执行以下代码:

var unids = context.getSubmittedValue();
removeDocuments(unids); //SSJS function performing the actual delete
viewScope.reload = 'reload' //triggers the hashmap to be rebuild based on new documentcollection
于 2012-07-26T08:46:57.483 回答