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

时间:2017-08-29 22:45:49

标签: netsuite suitescript suitescript2.0

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

4 个答案:

答案 0 :(得分:1)

事实证明它根本不是模块加载问题;当从不同的地方调用(NS客户端事件与自定义按钮中的任意JS函数)时,N/log代码特别是JS环境中存在问题。

从按钮调用log.debug()时,JS环境定义了以下变量并带有值: NLScriptIdForLoggingNLDeploymentIdForLogging,但是从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页。希望这会有所帮助。