如何在UI Page(Jelly)的g:evaluate中访问输入框动态数据?
问题分析与解决方案
核心问题本质
g:evaluate是在页面服务器端渲染阶段执行的Jelly代码,页面加载完成后就不会再次运行,所以它根本无法获取用户在客户端输入框中实时输入的内容——你之前尝试的${input_field_value}只能拿到页面渲染时该字段的初始值(也就是空值),后续输入框内容变化不会触发g:evaluate重新执行。
正确实现方案:GlideAjax调用Script Include
你考虑的GlideAjax方案是可行的,这是ServiceNow中客户端触发服务器端逻辑的标准方式,具体实现步骤如下:
1. 创建服务器端验证的Script Include
创建一个可被客户端调用的Script Include,编写字段验证逻辑:
var InputFieldValidator = Class.create(); InputFieldValidator.prototype = Object.extendsObject(AbstractAjaxProcessor, { validateInput: function() { // 获取客户端传入的输入值 var inputValue = this.getParameter('sysparm_input_value'); // 这里编写你的验证逻辑,比如格式校验、重复检查等 var isValid = true; if (!inputValue || inputValue.length < 3) { isValid = false; } // 根据验证结果返回对应信息 return isValid ? "输入合法" : "输入长度不能少于3位"; }, type: 'InputFieldValidator' });
2. 修改UI Page的HTML/Jelly代码
保留输入框,移除无效的g:evaluate代码:
<g:cs_ui_text_field class="p" name="input_field_value" id="input_field_value" value="" onchange="validateRequest();" /> <!-- 保留你的自定义输入框宏,无需额外Jelly服务器端代码 -->
3. 修改客户端脚本,通过GlideAjax调用验证逻辑
function validateRequest() { // 获取输入框的实时值 var inputVal = document.getElementById('input_field_value').value; // 初始化GlideAjax对象 var ga = new GlideAjax('InputFieldValidator'); // 指定要调用的Script Include方法 ga.addParam('sysparm_name', 'validateInput'); // 将输入框值传入服务器端 ga.addParam('sysparm_input_value', inputVal); // 异步调用服务器端逻辑,处理返回结果 ga.getXMLAnswer(function(response) { // 根据返回结果做后续处理,比如弹窗提示、样式修改等 alert(response); }); }
补充说明
- 优先使用异步的
getXMLAnswer(),避免getXMLWait()的同步调用导致页面卡顿。 - 验证逻辑可按需扩展,比如检查输入值是否在数据库中重复、是否符合特定格式等,所有逻辑都在Script Include中实现即可。
内容的提问来源于stack exchange,提问作者Sulec
相关产品推荐
相关产品推荐

