ServiceNow中如何实现Client Script调用Script Include?
Client Script通过GlideAjax调用Script Include的实现规范与问题排查
标准实现的两端配置要求
1. Script Include端配置
- 基础配置校验:Name字段填写为
scriptIncludeNameUtils,勾选Client callable,确认应用范围归属为sn_hr_core命名空间 - 代码结构必须符合GlideAjax的识别规范,示例结构:
var scriptIncludeNameUtils = Class.create(); scriptIncludeNameUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, { MethodName: function() { // 从前端请求中取出传入的分配组sys_id var groupSysId = this.getParameter('sysparm_assignment_group'); // 原有COE配置匹配逻辑,查询对应配置值 var matchedCoe = ''; var grCoeConfig = new GlideRecord('u_hr_coe_config'); grCoeConfig.addQuery('u_assignment_group', groupSysId); grCoeConfig.query(); if (grCoeConfig.next()) { matchedCoe = grCoeConfig.u_coe_value.toString(); } // 以字符串形式返回结果供前端读取 return matchedCoe; }, type: 'scriptIncludeNameUtils' });
2. Client Script端配置
- 基础配置校验:类型设为onChange,触发字段为分配组(
assignment_group),应用范围与Script Include保持可跨访问的层级 - 代码示例:
function onChange(control, oldValue, newValue, isLoading, isTemplate) { // 页面加载、清空字段时不执行请求,清理目标字段值即可 if (isLoading || newValue === '') { g_form.clearValue('u_hr_coe'); return; } // 初始化GlideAjax实例,类名与Script Include名称完全一致 var coeAjax = new GlideAjax('scriptIncludeNameUtils'); // 指定要调用的后端方法名 coeAjax.addParam('sysparm_name', 'MethodName'); // 把当前变更的分配组sys_id传给后端 coeAjax.addParam('sysparm_assignment_group', newValue); // 异步回调处理返回结果 coeAjax.getXMLAnswer(function(coeResult) { // 拿到匹配的COE值后赋值给目标字段 g_form.setValue('u_hr_coe', coeResult); }); }
常见问题排查清单
- 类名大小写不匹配:前端
GlideAjax传入的类名必须和Script Include的Name字段值完全一致,ServiceNow对类名、方法名严格大小写校验,哪怕一个字母大小写错都会触发类不存在的报错 - 未开启客户端可访问权限:Script Include的
Client callable配置项必须勾选,未勾选时前端请求会被系统权限层直接拦截,不会执行业务逻辑,且通常无明确前端报错,仅返回空响应 - 跨应用范围隔离:当前场景下Script Include属于
sn_hr_core命名空间,需确认其可访问范围已开放给Client Script所属的应用层级,若Script Include被限制为仅sn_hr_core内部可访问、而Client Script是全局范围的,会因权限不足无法加载类实例 - 漏传方法名参数:GlideAjax请求必须通过
addParam('sysparm_name', 'MethodName')指定要调用的后端方法名,漏传该参数时后端无法匹配要执行的逻辑 - 后端参数获取错误:Script Include内的方法获取前端传值时,必须使用
this.getParameter('自定义参数键名')的方式,不能直接硬编码变量,否则会拿不到前端传的分配组字段值 - 同步调用阻塞:禁止使用
getXMLWait()方法,该方法会阻塞页面所有交互直到请求返回,在现代浏览器环境下可能被拦截,需使用getXMLAnswer的异步回调模式处理返回结果 - 回调位置错误:GlideAjax是异步执行机制,不能在
getXMLAnswer调用代码块外部直接引用返回值做赋值,所有依赖返回值的逻辑(比如给u_hr_coe字段赋值)必须写在回调函数内部 - 返回值格式异常:Script Include的方法不能直接返回GlideRecord对象或自定义复杂结构,必须将取值转为字符串格式返回,否则前端会解析得到
[object Object]无法正常赋值
内容的提问来源于stack exchange,提问作者Mr world wide
相关产品推荐
相关产品推荐

