我正在编写客户端脚本,该脚本从alm_hardware表读取数据,并从字段u_invoice_date读取值,该值显示在称为invoice_date的表单字段中。
此脚本工作正常,但我发现一个问题:当资产管理器在特定设备的表单中未填写u_invoice_date字段时,输出为空白。工作脚本如下:
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading) {
return;
}
if (newValue == '') {
g_form.setValue("invoice_date", "");
return;
}
var reqVarHelper = new GlideAjax('x_swea2_wies_servi.WPCatalogItemClientHelpers');
reqVarHelper.addParam('sysparm_name', 'getRecord');
reqVarHelper.addParam("sysparm_table", "alm_hardware");
reqVarHelper.addParam("sysparm_query", "sys_id=" + g_form.getValue("select_device"));
reqVarHelper.addParam("sysparm_fields", "name,u_invoice_date");
reqVarHelper.getXML(function(response) {
var result = JSON.parse(response.responseXML.documentElement.getAttribute("answer"));
g_form.setValue("invoice_date", result.u_invoice_date);
});
}
然后我发现表fm_expense_line和字段日期总是字段,因此有机会的形式将有一些值总是在那里。
我开始用替换脚本中的表和字段来修改遗留脚本,但它不起作用,你在下面的脚本中看到任何问题吗?
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading) {
return;
}
if (newValue == '') {
g_form.setValue("invoice_date", "");
return;
}
var reqVarHelper = new GlideAjax('x_swea2_wies_servi.WPCatalogItemClientHelpers');
reqVarHelper.addParam('sysparm_name', 'getRecord');
reqVarHelper.addParam("sysparm_table", "fm_expense_line");
reqVarHelper.addParam("sysparm_query", "sys_id=" + g_form.getValue("select_device"));
reqVarHelper.addParam("sysparm_fields", "name,date");
reqVarHelper.getXML(function(response) {
var result = JSON.parse(response.responseXML.documentElement.getAttribute("answer"));
g_form.setValue("invoice_date", result.date);
});
}
在浏览器控制台中检查,没有与此主题相关的错误。任何想法,为什么它不工作在新的脚本?
我试图从脚本中删除JSON部分,并将其替换为console.log,但可能是我在那里也犯了错误,因此返回到post中添加的版本。
这是GlideRecord的一个特点——当值为null时,它不能很好地处理任何硬类型字段(期望非空值,如字符串或数字)。当你给一个null
GlideForm.setValue(),该函数看到null
说"我猜没有变化,所以不会做任何事情!">
有几种方法可以通过处理result.date
的null
结果来处理这个问题(我将按我的偏好顺序列出它们)。
- 使用逻辑
OR
运算符替换任何非真值(注意,这替换了null
,undefined
,false
和0
)
result.date || ''
- 使用隐式强制转换来强制一个字符串(在JS中,强制转换是根据初始对象的类型完成的)
'' + result.date
- 如果这些不工作(我已经看到,但无法提供可靠的原因),尝试使用
.getValue()
函数与前面的一个相结合:
result..getValue('date') || ''
'' + result.getValue('date')
- 我只提到最后一个方法,因为一个同事每次在任何地方对每个值都使用它。我认为这是野蛮和丑陋的,但他们发誓。为什么它工作,我不知道-它打破了JS中的合并规则,所以它必须更多的"现在魔术";这让我很抓狂
result.date + ''
还有我最喜欢的nulish -coalesce,但是我不相信它在ES6中被UI/Next所支持,所以它不是ServiceNow讨论的一部分。