2017-08-29 12 views
1

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爆弾の最初の呼び出し。 (ログメッセージはまた、NSの実行ログに表示)それはfieldChangedイベントから呼び出されますときに、このコードからコンソール出力だと動作します。ここ

/** 
* @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 
    }; 
}); 

:ここ

は、ワイヤ上ボタンのコードです

[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

クライアントスクリプトでは、 'N/log'依存関係が必要ですが、定義関数の名前は' https'です。 'log'は定義されていません。 –

答えて

1

モジュール搭載の問題ではありませんでした。 N/logコードの問題であり、異なる場所(NSクライアントイベントとカスタムボタンからの任意のJS関数)から呼び出されるときのJS環境です。

log.debug()がボタンから呼び出されている場合は、JS環境は、以下の定義された変数と値を持っている: NLScriptIdForLoggingNLDeploymentIdForLoggingを、しかしlog.debug()が正常NSクライアントイベントから呼び出されたときにこれらが定義されていませんでした。

あなたがlog.debug()を呼び出す前に次のことを実行した場合は、ボタンのコードから正常に実行されます:

delete NLScriptIdForLogging; 
delete NLDeploymentIdForLogging; 

私は、これらがやろうとしているかわからないので、私はちょうどそれらをチェックすることだし、 log.debug()呼び出しをスキップします(または、JSコンソールがある場合はJSコンソールにルーティングします)。

これはNSのバグのようです。私はそれを報告する方法を知っていますか?

0

"iceUtil.logDebugの最初の呼び出しは爆弾です。"これは非常に曖昧です。実際のエラー出力(最も重要なのは、メインエラーと、自分のコードを参照するスタックトレースの最初の行)を投稿して、コード内でバグを探すヒントを人に伝えます。

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

私は、基礎となるコードはcontext.form.addButtonへの通話を処理するが、私はプロパティから疑うのか分からない。でも、実際のエラーなしで、私はこの行は非常に疑わしいと言うだろう

functionNameは、有効な唯一の値は、範囲context内の関数の名前を含む[String]です。

代わりに、あなたが呼び出しているaddButton()メソッドに意味がないと思われる何らかの動的関数の作成を非常に難しくしています。

context.form.addButtonはどこから来ましたか?これはネイティブjsではなく、コード例から明らかな参照がありません。その方法はあなたが言及していないライブラリによって提供されていますか?

+0

ありがとう、元の投稿をコンソール出力とエラースタックトレースで更新し、渡されたパラメータも削除しましたが、引き続き問題があります。 – josh

0

addButtonのプロパティは、機能の名前を予期しています。私はあなたが関数を呼び出すことができ、そのようなパラメータを渡すことができるとは思わない。

クリックハンドラは、現在のレコードのIDをcontextから読み取るか、またはNetSuiteのN/currentRecordモジュールを使用して読み取る必要があります。

+0

提案していただきありがとうございます。私はそれをparamを渡さないように変更しました(括弧の有無にかかわらず)。そしてそれは同じ方法でまだ爆弾です。 (私は[このブログの投稿](https://ursuscode.com/netsuite-tips/suitescript-2-0-quickstart-samples/#comment-3159860869)のコメントからそのテクニックを得ました)。 – josh

+0

参考までに、元の投稿をパラメータを渡そうとしないより簡単なコードに更新しました。 – josh

0

NetSuiteのオブジェクト設定の更新が原因で問題が発生している可能性があります。これは多少入力する必要がありますので、詳しくはNetSuiteのマニュアルhereを参照してください。それがあなたの状況に十分な文脈を与えていない場合は、2017.2リリースノート、67および68ページを参照してください。これが役立つことを願っています。

関連する問題