1

我在 javascript AMD 模块中有一些代码。如果我创建一个引用它并部署它的 ClientScript,则从 ClientScript 事件调用代码时运行良好。但是,如果我从自定义按钮单击事件中调用完全相同的函数,它会在 require.js 中出现意外错误(请参阅帖子末尾的控制台输出)。

这是客户端脚本代码:

/**
 * @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

4 回答 4

1

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

log.debug()按钮调用时,JS 环境定义了以下变量并具有值: NLScriptIdForLogging和,但是当从 NS 客户端事件成功调用NLDeploymentIdForLogging时,这些变量没有定义。log.debug()

如果您在调用之前运行以下命令log.debug(),它将从按钮代码成功运行:

delete NLScriptIdForLogging;
delete NLDeploymentIdForLogging;

我不确定这些试图做什么,所以我只是检查它们并跳过log.debug()调用(或者将它路由到 JS 控制台,如果它在那里)。

这似乎是一个 NS 错误。有谁知道我如何举报?

于 2017-08-31T18:55:39.257 回答
0

functionName属性 addButton只需要函数的名称。我不相信你可以调用函数并传递这样的参数。

您的点击处理程序将需要从 NetSuitecontext或使用 NetSuite 的N/currentRecord模块读取当前记录的 ID。

于 2017-08-30T05:18:17.680 回答
0

由于 NetSuite 中所需对象配置的更新,您可能会遇到问题。输入会有点多,因此请参阅此处的 NetSuite 文档了解详细信息。如果这没有为您的情况提供足够的背景信息,请参阅 2017.2 发行说明,第 67 和 68 页。希望这会有所帮助。

于 2017-08-31T16:16:45.380 回答
0

“第一次调用 iceUtil.logDebug 炸弹。” 这是非常模糊的。发布实际的错误输出(最重要的是主要错误和堆栈跟踪中引用您自己的代码的第一行),以向人们提供一些提示,以在您的代码中查找您的错误。

即使没有实际错误,我会说这条线看起来非常可疑:

functionName : 'calculateConfigurations(' + context.newRecord.id + ')'

我不知道处理您对 的调用的底层代码是什么context.form.addButton,但我怀疑从属性名称functionName中给出的唯一有效值是 a[String]包含范围内的函数名称context

相反,您正在非常努力地创建某种动态函数,这可能对addButton()您调用的方法的意义为零。

是从哪里来context.form.addButton的?它不是本机 js,并且从您的代码示例中没有明显的参考。该方法是由您未提及的库提供的吗?

于 2017-08-30T01:20:47.910 回答