【问题标题】:Xpages how to get CSJS confirmation in SSJSXpages如何在SSJS中获得CSJS确认
【发布时间】:2015-05-07 05:09:55
【问题描述】:

我有一个重复控件,其中包含一个按钮,该按钮将处理用户选择的文档。我的第一个用例是删除。我使用 view.postScript 检测用户是否选择了至少一个文档并发布错误消息(如果没有)。

我想添加一个确认对话框,确认用户想要对文档执行操作(例如删除它们),但找不到执行此操作的方法。

理想情况下,我想在我当前的 SSJS 中完成这一切。

下面是我的代码,其中有一个存根用于我想要求用户确认的位置。

任何帮助将不胜感激。

//Did the user select a document
var hasSelected:Boolean = false;
for (var id in SelectedDocs.getSelectedIDs()) {     
        hasSelected = true;
        break
}

//If false then set a warning
if (hasSelected == false)
{
x="alert('Error\\n\\nPlease select one or more documents to delete.\\n\\n');";
view.postScript(x)
return
}

//If true then ask confirmation
if (hasSelected == true)
{
}

var rspView:NotesView = database.getView("(dbAllRpPCTasks)")

for (var id in SelectedDocs.getSelectedIDs()) {     

        //Get each selected doc
        var doc:NotesDocument = database.getDocumentByID(id);

        //Get child docs and delete them
        var key:String = doc.getItemValueString("ID");
        var dc:NotesDocumentCollection = rspView.getAllDocumentsByKey(key);
        if (dc.getCount() != 0) 
            {dc.removeAll(true);}

        //Delete the selected doc
        doc.remove(true)
        doc.recycle();
        SelectedDocs.setSelectedState(id,false);
}

感谢所有建议。我正在回应弗兰克的回答。尝试编写 CSJS 来确定用户是否选择了文档然后继续。

在 CSJS 中我的按钮的点击事件中,我有以下内容:

var dtList = document.getElementsByName("#{id:dataView1.getSelectedIds()}");
confirm("What is the length?" + dtList.length);
confirm("Can I get an item?" + dtList.item(0));

它返回零长度,并且项目未定义。

【问题讨论】:

  • Bryan - 你没有接受任何答案。这些对你有用吗?

标签: xpages xpages-ssjs


【解决方案1】:

与 LotusScript 不同,XPages 代码不能等待用户输入。可以把它想象成调用一个代理在服务器上运行并在其中添加一个 UIWorkspace.prompt() (这会引发错误,因为不允许用户交互)。

最好的建议是将确认提示作为 CSJS 添加到用户最初单击的按钮中,例如

return confirm("Are you sure?");

如果他们选择了文档,他们会在继续之前收到提示。如果他们没有,它可能会提示一些用户仍然选择文档。对于没有选择任何文档、点击他们想要继续的用户的抱怨,然后抱怨获得另一个对话框,这是很难同情的。

【讨论】:

  • 加分项:使用 XSP.confirm("...") 获得更好的行为,以防您的应用最终采用 XPiNC 或其他未来改进。
  • 其实我的应用在 XPiNC 中。我仍然想把确认权放在 SSJS 中。我可以用 XSP.confirm 做到这一点吗?
  • 没有。 SSJS 必须在服务器上运行完成。整个 SSJS 在 Invoke Application 阶段运行,view.postScript 将 CSJS 添加到“视图”Java 对象中,然后在 Render Response 阶段提取该代码,以将其写入 HTML 并发送回服务器。跨度>
【解决方案2】:

您是否尝试过对按钮使用简单操作?我使用确认操作来验证用户没有意外点击按钮(不幸的是,这是一个常见问题)。接下来,我验证我的表单并在自定义消息区域 (Thanks to Tommy Valand) 中显示任何消息,但您可以使用普通消息区域。

创建一个操作组并放置您的 SSJS 表达式(或 EL)以有条件地执行。在页面中显示消息而不是弹出窗口。

【讨论】:

    【解决方案3】:

    一点理论 - 每个动作都可以有这些组合:

    • CSJS
    • CSJS + SSJS
    • CSJS + SSJS + CSJS
    • SSJS
    • SSJS + CSJS

    所以你必须结合一个或多个动作来完成你想做的事情。可用于链接调用的技术:

    • XSP.partialRefreshGet/Post
    • view.postscript(结合以上)
    • onComplete 事件的属性
    • 在渲染阶段计算的内联 CSJS
    • 由 CSJS 发起的隐藏按钮 (postscript/onComplete)
    • ExtLib RPC 调用

    我对您的用例的建议是在事件的 CSJS 中(执行前)检测用户是否选择了任何文档(DOM 操作)。如果没有,请使用return false; 停止事件执行(在 CSJS 提示符下有适当的解释)。

    编辑:确切的用例 将您的用例分为两个问题:条件和执行。

    1.条件

    您真的需要致电 SSJS 来获取该信息吗?这取决于您用于选择文档的内容 - 您的 SelectedDocs 对象是什么?在某些情况下,您可以将(字面上)选定的文档数量渲染到 DOM(假设选择触发部分/完全刷新)并在调用 SSJS 之前在 CSSJ 中使用它。所以重新考虑你的需求/方法。

    2。执行

    真的需要SSJS + CSJS + SSJS 组合吗?我怀疑。

    这是基于 SSJS(+CSJS) 的用例示例。它模拟 50:50 的机会显示提示或删除文档。你明白了,只需更新第一个操作组以获取所选计数。

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view
        xmlns:xp="http://www.ibm.com/xsp/core"
        xmlns:xp_1="http://www.ibm.com/xsp/coreex">
        <xp:button
            value="Label"
            id="button1">
            <xp:eventHandler
                event="onclick"
                submit="true"
                refreshMode="partial" refreshId="button1">
                <xp:this.action>
                    <xp:actionGroup>
                        <xp:actionGroup>
                            <xp:executeScript
                                script="#{javascript:requestScope.docnum = @Integer( @Random() * 2 );}">
                            </xp:executeScript>
                        </xp:actionGroup>
                        <xp:actionGroup
                            condition="#{javascript:requestScope.docnum == 0;}">
                            <xp:executeScript>
                                <xp:this.script><![CDATA[#{javascript:view.postScript('alert("No documents selected...");');}]]></xp:this.script>
                            </xp:executeScript>
                        </xp:actionGroup>
                        <xp:actionGroup
                            condition="#{javascript:requestScope.docnum != 0;}">
                            <xp:executeScript
                                script="#{javascript:// delete documents}">
                            </xp:executeScript>
                        </xp:actionGroup>
                    </xp:actionGroup>
                </xp:this.action>
            </xp:eventHandler>
        </xp:button>
    </xp:view>
    

    【讨论】:

    • Frantisek,我正在尝试通过编写 CSJS 来实施您建议的解决方案,该解决方案将检测用户是否选择了文档,然后如果他们没有选择则停止执行并发出警报,或者如果他们选择则继续.
    • Frantisek,我正在尝试通过编写 CSJS 来实施您建议的解决方案,该解决方案将检测用户是否选择了文档,然后如果他们没有选择则停止执行并发出警报,或者如果他们选择则继续.这正是我想要做的,因为这个解决方案将适用于我拥有的许多其他用例。我已经能够在我的 CSJS 中处理数据视图,但仅此而已。它显示长度为零。我当然需要行,最终需要 selectedID。但我一直得到长度为 0,并且没有项目。我将代码粘贴回原来的问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多