我有一个带有dojo代码的网页,包括传递给dojo.addOnLoad的函数,代码如下:
laborDetailHandler.RevenueTotalInput = dojo.byId('#{id:LaborRevenueTotal}');
if (!laborDetailHandler.RevenueTotalInput) {
console.warn('RevenueTotalInput not found.')
}
如果此代码是内联的,即使它在LaborRevenueTotal输入框上方,它也能正常工作。
如果将此代码移出到脚本库,我会收到“未找到RevenueTotalInput”。消息,它告诉我dojo.addOnLoad接收函数并执行它,但由于某种原因,该函数无法正常工作。
我完全被这里难住了。有人有什么想法吗?
答案 0 :(得分:1)
'#{...}'表达式在SSJS库中不起作用,仅在XPage或自定义控件的源中。
解决方法:在其他地方使用#{}子句(例如,文本字段),并在客户端脚本中引用它。
答案 1 :(得分:0)
我道歉!我认为这是一个道场问题;相反,这是一个Lotus Notes XPages问题!我仍然不确定为什么会这样,但有人corroborated the that problem is larger than my script以及如何解决它。
我的解决方法是,而不是在脚本库中找到这些元素,以获取我需要的元素的句柄,并将它们传递给脚本库中的初始化函数。
非常感谢你的回应。对不起,我的问题很糟糕。
答案 2 :(得分:0)
虽然脚本库不是在XPage中编译的;它们也不会内联运行。
XPages中的最佳实践是在脚本库中使用黑盒方法。对脚本库中定义的所有函数使用参数化(对服务器端和客户端都有效)。
在SSJS中,您可以通过getComponent获取组件对象并了解其客户端ID,但这会降低脚本库的可重用性。如果你只是为了保持你的XSP代码干净就好了;但请确保使用错误陷阱(try / catch),因为调试SSJS会很头疼。
答案 3 :(得分:0)
如果将代码放在XPage上的属性或事件中,它将作为String传递给评估者。如果您在Package Explorer视图中查看为XPage创建的Java类,您将看到我的意思。代码是一个String,然后传递给Java函数,该函数在页面加载或运行时对其进行评估。
我认为脚本库中的代码不会通过评估程序,因此不会计算#{id:myField}。还有一个上下文问题,可以在渲染的HTML页面上识别哪个 myField。
围绕它有两种方法。一种是将ID从您的XPage事件传递到SSJS / CSJS函数中。 CSJS中的另一个选项是使用dojo.query。