【问题标题】:How to design XPages JS functions for use in library?如何设计 XPages JS 函数以在库中使用?
【发布时间】:2014-01-15 22:59:08
【问题描述】:

创建 XPages 应用程序,代替用户填写简单的 Excel 并将其邮寄给用户。

首先我在表单上有两个编辑框,Hours10 和 Hours20。

希望将输入到 Hours20 的值也转到 Hours10。

当我在 Hours20 编辑框的 onChange 事件中有此代码时

var hours20 = XSP.getElementById("#{id:Hours20}").value; 
XSP.getElementById("#{id:Hours10}").value = hours20; 

它可以工作,并且 Hours10 编辑框会更新为 Hours20 中的值。

当我将代码移动到保存在客户端 javascript 库中的函数中时:

function updateHours() {
  var hours20 = XSP.getElementById("#{id:Hours20}").value; 
  XSP.getElementById("#{id:Hours10}").value = hours20; 
}

并从 Hours20 编辑框的 onChange 事件中调用它:updateHours();

它不起作用。在 XSP 对象上给我一个找不到对象的错误。

不知道为什么会出错 - 我猜 XSP 不再在 Scope 中?

有什么想法或解决方法吗?

【问题讨论】:

    标签: xpages


    【解决方案1】:

    表达式语言(例如#{id:Hours20})只能在组件属性的上下文中进行解释,例如字段的onChange 事件代码。一旦将代码移到单独的库中,代码就不再是组件的属性,而是可以在组件属性中引用的代码。

    与任何其他好的函数一样,设计所有客户端 JavaScript 函数以接受任何可能与上下文相关的参数作为参数。例如:

    function updateHours(inputId, outputId) {
      var hours20 = XSP.getElementById(inputId).value; 
      XSP.getElementById(outputId).value = hours20; 
    }
    

    那么你的onChange事件可以引用这个函数,但是只传入上下文相关的信息:

    updateHours("#{id:Hours20}", "#{id:Hours10}");
    

    通过这种方式,您可以在脚本库中保留可重用的业务逻辑,这始终是一件好事,但这些库中的任何内容都不会假设页面结构或服务器端变量。

    【讨论】:

    • 嗯...我认为 EL 不会在 JavaScript 库中解析,只有在直接添加到 XPage 时(例如在脚本块中)它不依赖于组件/事件的上下文。还是我错过了什么?
    • 这确实是一个有趣的话题:f.e.我经常想知道为什么可以在 ssjs 库中使用“getComponent”(我个人避免这样做,但我已经看到了可行的实现)
    • @LotharMueller:为什么不能在 SSJS 库中使用 getComponent
    • Sven,你说对了一半:EL 只有在添加到 XPage 时才会被解析,因为它依赖于组件上下文,尤其是 SSJS,它需要知道 @ 987654326@指。这就是为什么ValueBindingExMethodBindingEx 都有一个setComponent 方法:它建立了那个上下文。库中的 SSJS 没有上下文; XPage 上调用库函数的代码确实 具有上下文并可以将其传入。CSJS 库直接发送到浏览器,不执行 EL 解释; scriptBlock 是一个组件,因此它的渲染器在发送标签时会评估任何值绑定。
    • Lothar,因为包含 getComponent 的库代码只能由带有组件上下文的 MethodBindingEx 触发,所以该函数的 Java 基础知道它是从“哪里”调用的,并且可以使用它尝试查找具有匹配 ID 的最近组件的上下文。但是你最好避免调用这个函数,因为几乎总是有更好的方法。 getComponent 的两个有效案例是自定义验证器,其中一个值的有效性取决于另一个组件的提交值,并触发组件事件(即getComponent('dialog').show();)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多