自定义控件:如何在onClientLoad中获取compositeData
在CSJS中获取自定义控件的needsLogout属性
当然可以实现,核心思路是把服务器端的compositeData属性值传递到客户端JS环境——因为CSJS运行在浏览器端,没法直接访问服务器端的compositeData对象。这里提供两种常用方案:
方案一:直接在CSJS中嵌入SSJS表达式解析属性值
在自定义控件的onClientLoad事件里,用XPage的表达式语言直接把compositeData.needsLogout的值解析成客户端JS能识别的布尔值,再判断执行超时逻辑:
// 从服务器端获取needsLogout属性值,渲染时会被解析为true/false var enableTimeout = #{javascript:compositeData.needsLogout}; if (enableTimeout) { var thisUrl = window.location.pathname; var finalPath = thisUrl + "?Logout&redirectto=" + thisUrl + "?opendatabase&login"; setAutoRefresh(15000, finalPath); }
原理:服务器渲染页面时,会把#{javascript:compositeData.needsLogout}解析成对应的布尔值(true或false),输出到客户端JS代码中,CSJS就能直接用这个值判断是否执行逻辑。
方案二:通过DOM元素中转属性值
如果需要更灵活的传递方式(比如属性值需复用或可能动态变化),可以把属性值存到页面隐藏控件里,再用CSJS读取:
- 在自定义控件中添加绑定到
compositeData.needsLogout的隐藏输入框:
<xp:inputText id="hdnNeedsLogout" type="hidden" value="#{compositeData.needsLogout}" ></xp:inputText>
- 在
onClientLoad的CSJS中读取该隐藏控件的值:
// 用#{id:...}获取控件的客户端ID,避免命名冲突 var hdnElement = document.getElementById("#{id:hdnNeedsLogout}"); var enableTimeout = hdnElement && hdnElement.value === "true"; if (enableTimeout) { var thisUrl = window.location.pathname; var finalPath = thisUrl + "?Logout&redirectto=" + thisUrl + "?opendatabase&login"; setAutoRefresh(15000, finalPath); }
两种方案都能满足需求:方案一更简洁直接,适合简单布尔值传递;方案二更适合多场景复用属性值或处理复杂类型的情况。
内容的提问来源于stack exchange,提问作者theBastian
相关产品推荐
相关产品推荐

