Netsuite 将模块加载到从自定义按钮调用的客户端脚本中

Netsuite 将模块加载到从自定义按钮调用的客户端脚本中,netsuite,suitescript,suitescript2.0,Netsuite,Suitescript,Suitescript2.0,我在javascript AMD模块中有一些代码。如果我创建一个引用它并部署它的ClientScript,那么当从ClientScript事件调用时,代码运行良好。但是,如果我从自定义按钮单击事件调用完全相同的函数,它会在require.js中出现意外错误(请参阅本文末尾的控制台输出) 以下是ClientScript代码: /** * @NApiVersion 2.0 * @NScriptType ClientScript * @NModuleScope public */ 'use

我在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
    }
});
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;