我在javascript AMD模块中获得了一些代码。如果我创建一个引用它并部署它的ClientScript,则从ClientScript事件调用时代码运行正常。但是,如果我从自定义按钮单击事件中调用完全相同的函数,它会在require.js中发生意外错误(请参阅控制台输出的帖子末尾)。
这是ClientScript代码:
/**
* @NApiVersion 2.0
* @NScriptType ClientScript
* @NModuleScope public
*/
'use strict'
require.config({
paths: {
'iceUtil': 'SuiteScripts/ieCommon/iceUtil'
}
});
define(['N/log', 'iceUtil'], function (https, iceUtil) {
function calculateConfigurations() {
console.log('calculateConfigurations: before native log call');
log.debug({
title: 'calculateConfigurations',
details: 'nothing'
})
console.log('calculateConfigurations: before iceUtil log call');
iceUtil.logDebug('calculateConfigurations - iceUtil log',
'nothing');
}
function fieldChanged() {
iceUtil.logDebug('pageInit', 'begining client event');
calculateConfigurations();
iceUtil.logDebug('pageInit', 'ending client event');
}
return {
calculateConfigurations: calculateConfigurations
, fieldChanged: fieldChanged
}
});
iceUtil.js实际上只包含了本机NetSuite日志功能。
这很好用,并且从fieldChanged事件触发调用时显示所有日志。
但是,如果我使用以下代码将其连接到自定义按钮,则只会运行第一个console.log('recordId: ' + recordId);
调用。第一次打电话给iceUtil.logDebug
炸弹。
这里是连接按钮的代码:
/**
* @NApiVersion 2.x
* @NScriptType UserEventScript
*/
define(["N/log", "../ieCommon/iceUtil"], function (log, iceUtil) {
function addCalcConfigsButton(context) {
if(context.type==context.UserEventType.EDIT) {
context.form.clientScriptFileId = 6222;
//context.form.clientScriptModulePath = 'SuiteScripts/ieOppMetrics/clientCalculateConfigurations.js'; // This also works
context.form.addButton(
{
id : 'custpage_buttonid',
label : 'Calculate Configurations',
functionName : 'calculateConfigurations'
}
);
iceUtil.logDebug("addCalcConfigButton - iceUtil log",
"Button added.");
log.debug({
title: 'addCalcConfigButton - native log',
details: 'Button added.'
});
}
}
return {
beforeLoad : addCalcConfigsButton
};
});
这是来自fieldChanged事件并且可以正常工作的此代码的控制台输出(日志消息也显示在NS执行日志中):
[Log] calculateConfigurations: before native log call
[Log] calculateConfigurations: before iceUtil log call
这里是按下按钮的控制台输出并失败(NS执行日志中没有日志消息):
[Log] calculateConfigurations: before native log call
[Error] UNEXPECTED_ERROR: Unexpected Error
onError (bootstrap.js:150)
onError (NsRequire.js:645)
check (NsRequire.js:994)
enable (NsRequire.js:1251)
init (NsRequire.js:882)
(anonymous function) (NsRequire.js:1547)
答案 0 :(得分:1)
事实证明它根本不是模块加载问题;当从不同的地方调用(NS客户端事件与自定义按钮中的任意JS函数)时,N/log
代码特别是JS环境中存在问题。
从按钮调用log.debug()
时,JS环境定义了以下变量并带有值:
NLScriptIdForLogging
和NLDeploymentIdForLogging
,但是从NS客户端事件成功调用log.debug()
时未定义这些内容。
如果在调用log.debug()
之前运行以下命令,它将从按钮代码成功运行:
delete NLScriptIdForLogging;
delete NLDeploymentIdForLogging;
我不确定这些尝试是做什么的,所以我只是检查它们并跳过log.debug()
调用(或者将其路由到JS控制台,如果它的话。有)。
这似乎是一个NS bug。有谁知道我怎么报告它?
答案 1 :(得分:0)
“第一次调用iceUtil.logDebug炸弹。”这非常模糊。发布实际的错误输出(最重要的是主错误和堆栈跟踪中引用您自己的代码的第一行),以便为人们提供一些提示,以便在您的代码中查找您的错误。
即使没有实际错误,我也会说这条线看起来非常可疑:
functionName : 'calculateConfigurations(' + context.newRecord.id + ')'
我不知道处理您对context.form.addButton
的调用的底层代码是什么,但我怀疑来自属性名functionName
的唯一有效值是{{1}包含[String]
范围内的函数名称。
相反,你正在努力做一些动态函数创建,这可能对你调用的context
方法没有任何意义。
addButton()
来自哪里?它不是本机js,并且没有来自您的代码示例的明显参考。这个方法是由你未提及的图书馆提供的吗?
答案 2 :(得分:0)
functionName
的{{1}}属性仅期待该函数的名称。我不相信你可以调用这个函数并传递这样的参数。
您的点击处理程序需要从addButton
或使用NetSuite中的context
模块读取当前记录的ID。
答案 3 :(得分:0)
由于NetSuite中对require对象配置的更新,您可能会遇到问题。输入会有点多,所以请参阅NetSuite文档here了解详细信息。如果没有为您的情况提供足够的上下文,请参阅2017.2发行说明,第67和68页。希望这会有所帮助。