Netsuite 将模块加载到从自定义按钮调用的客户端脚本中
我在javascript AMD模块中有一些代码。如果我创建一个引用它并部署它的ClientScript,那么当从ClientScript事件调用时,代码运行良好。但是,如果我从自定义按钮单击事件调用完全相同的函数,它会在require.js中出现意外错误(请参阅本文末尾的控制台输出) 以下是ClientScript代码:Netsuite 将模块加载到从自定义按钮调用的客户端脚本中,netsuite,suitescript,suitescript2.0,Netsuite,Suitescript,Suitescript2.0,我在javascript AMD模块中有一些代码。如果我创建一个引用它并部署它的ClientScript,那么当从ClientScript事件调用时,代码运行良好。但是,如果我从自定义按钮单击事件调用完全相同的函数,它会在require.js中出现意外错误(请参阅本文末尾的控制台输出) 以下是ClientScript代码: /** * @NApiVersion 2.0 * @NScriptType ClientScript * @NModuleScope public */ 'use
/**
* @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
}
});
js实际上只是包装了本机NetSuite日志功能
这工作正常,当从fieldChanged事件触发调用时,所有日志都会显示
但是如果我使用下面的代码将它连接到一个自定义按钮,那么只有第一个console.log('recordId:'+recordId)代码>调用运行。第一次调用iceUtil.logDebug
bombs
下面是连接按钮的代码:
/**
* @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执行日志中):
以下是按下按钮失败后的控制台输出(NS执行日志中没有日志消息):
“第一次调用iceUtil.logDebug.bombs。”这是非常模糊的。发布实际的错误输出(最重要的是主错误和堆栈跟踪中引用您自己代码的第一行),为人们提供一些提示,让他们在您的代码中查找您的错误
即使没有实际的错误,我也会说这句话看起来非常可疑:
functionName : 'calculateConfigurations(' + context.newRecord.id + ')'
我不知道处理您对context.form.addButton
的调用的底层代码是什么,但我从属性名functionName
怀疑,给出它的唯一有效值是[String]
包含context
范围内的函数名
相反,您正在非常努力地创建某种动态函数,这可能对正在调用的addButton()
方法没有任何意义
context.form.addButton
来自哪里?它不是原生js,也没有明显的代码示例参考。该方法是否由您未提及的库提供?的addButton
属性只需要函数名。我不相信你可以调用这个函数并像那样传递参数
您的单击处理程序需要从上下文
或使用NetSuite中的N/currentRecord
模块读取当前记录的ID。由于NetSuite中的require对象配置的更新,您可能会遇到问题。这将是一个有点多的类型,所以请只参考NetSuite文档的详细信息。如果这不能为您的情况提供足够的背景,请参阅2017.2发行说明,第67和68页。希望这有帮助。事实证明,这根本不是模块加载问题;当从不同的地方调用时,N/log
code和JS环境中都存在问题(NS客户端事件与自定义按钮的任意JS函数)
从按钮调用log.debug()
时,JS环境定义了以下变量并带有值:
NLScriptIdForLogging
和NLDeploymentIdForLogging
,但从NS客户端事件成功调用log.debug()
时未定义这些
如果在调用log.debug()
之前运行以下命令,它将从按钮代码成功运行:
delete NLScriptIdForLogging;
delete NLDeploymentIdForLogging;
我不确定它们试图做什么,所以我只是检查它们并跳过log.debug()
调用(或者将其路由到JS控制台,如果有)
这似乎是一个NS错误。有人知道我如何报告吗?谢谢你的建议。我把它改为不通过param(无论有没有parens),它仍然以同样的方式爆炸。(顺便说一句,我从中的一条评论中获得了这种技术)。仅供参考,我用更简单的代码更新了原始帖子,该代码不尝试传递参数。谢谢,我用控制台输出和错误堆栈跟踪更新了原始帖子,还按照您的建议删除了传递的参数,但是我仍然有这个问题。在客户端脚本中,您需要N/log
依赖项,但其在定义函数中的名称是https
<代码>日志
未定义。
functionName : 'calculateConfigurations(' + context.newRecord.id + ')'
delete NLScriptIdForLogging;
delete NLDeploymentIdForLogging;