Oracle ADF如何向af:resource中的JS注入动态参数
Oracle ADF 动态注入EL值至JavaScript的解决方案
针对你遇到的直接在<af:resource>中使用EL表达式引发解析错误的问题,以下三种可行方案供你选择:
方法一:通过clientListener传参调用函数
调整点击事件的函数调用方式,直接将动态EL值作为参数传入JS函数,避免在<af:resource>块中写入EL:
页面代码修改
<af:resource type="javascript"> var chatSettings = {}; function init(url, id){ // 为变量赋值动态参数 chatSettings.url = url; chatSettings.id = id; // 原有init逻辑 ... } </af:resource> <af:image id="abc"> <af:clientListener method="function(){init('#{attrs.url}', '#{attrs.id}');}" type="click"/> </af:image>
ADF会在渲染页面时解析#{attrs.url}和#{attrs.id}为实际值,点击图片时将动态参数传入init函数完成赋值。
方法二:用隐藏组件存储动态值,JS读取
通过客户端可访问的隐藏组件存储动态值,JS中调用ADF客户端API读取:
页面代码修改
<!-- 存储动态值的隐藏组件,需开启clientComponent --> <af:inputHidden id="hdnUrl" value="#{attrs.url}" clientComponent="true"/> <af:inputHidden id="hdnId" value="#{attrs.id}" clientComponent="true"/> <af:resource type="javascript"> var chatSettings = {}; function init(){ // 通过ADF客户端API获取组件值 var url = AdfPage.PAGE.findComponentByAbsoluteId('hdnUrl').getValue(); var id = AdfPage.PAGE.findComponentByAbsoluteId('hdnId').getValue(); chatSettings.url = url; chatSettings.id = id; // 原有init逻辑 ... } </af:resource> <af:image id="abc"> <af:clientListener method="init" type="click"/> </af:image>
方法三:用<af:outputScript>替代<af:resource>
若需要在页面加载时就完成chatSettings的赋值,可使用支持EL解析的<af:outputScript>标签:
页面代码修改
<af:outputScript type="text/javascript"> var chatSettings = { url: "#{attrs.url}", id: "#{attrs.id}" }; function init(){ // 原有init逻辑 ... } </af:outputScript> <af:image id="abc"> <af:clientListener method="init" type="click"/> </af:image>
<af:outputScript>会在页面渲染阶段解析其中的EL表达式,直接生成包含动态值的JS代码。
注意事项
- 若动态值包含引号、斜杠等特殊字符,需使用EL函数转义,例如
#{fn:escapeXml(attrs.url)},避免引发JS语法错误。
内容的提问来源于stack exchange,提问作者Sourabh
相关产品推荐
相关产品推荐

