如何设计用于库的XPages JS函数?

Der*_*rek 0 xpages

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

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

想要输入到Hours20的值也转到Hours10.

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

var hours20 = XSP.getElementById("#{id:Hours20}").value; 
XSP.getElementById("#{id:Hours10}").value = hours20; 
Run Code Online (Sandbox Code Playgroud)

它工作正常,Hours10编辑框更新为Hours20的值.

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

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

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

这是行不通的.给我一个XSP对象上找不到对象的错误.

不确定为什么会出错 - 我的猜测是XSP不再是Scope?

任何想法或解决方法?

Tim*_*ony 9

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

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

function updateHours(inputId, outputId) {
  var hours20 = XSP.getElementById(inputId).value; 
  XSP.getElementById(outputId).value = hours20; 
}
Run Code Online (Sandbox Code Playgroud)

然后您的onChange事件可以引用此函数,但只传入上下文相关的信息:

updateHours("#{id:Hours20}", "#{id:Hours10}");
Run Code Online (Sandbox Code Playgroud)

这样,您就可以在脚本库中保留可重用的业务逻辑,这总是一件好事,但这些库中没有任何内容可以假设有关页面结构或服务器端变量的任何内容.

  • 嗯......我认为EL不会在JavaScript库中解析,只有在直接添加到XPage(脚本块中的fe)时才会解析它不依赖于组件/事件的上下文.还是我错过了什么? (2认同)