2017-08-29 4 views
1

J'ai du code dans un module AMD javascript. Si je crée un code client qui le référence et le déploie, le code s'exécute correctement lorsqu'il est appelé à partir de l'événement ClientScript. Mais si j'appelle exactement la même fonction à partir d'un événement de clic de bouton personnalisé, il bombarde avec une erreur inattendue à l'intérieur de require.js (voir la fin de la publication pour les sorties de la console).Chargement de modules dans le script Client à partir d'un bouton personnalisé

Voici le code 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 vraiment enveloppements juste la fonctionnalité de journal natif NetSuite.

Cela fonctionne correctement et tous les journaux s'affichent lorsqu'ils sont appelés à partir de l'événement fieldChanged.

Mais si je le connecte à un bouton personnalisé, en utilisant le code suivant, seul le premier appel console.log('recordId: ' + recordId); s'exécute. Le premier appel à iceUtil.logDebug bombes.

Voici le code qui les fils jusqu'à la touche:

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

est ici la sortie de la console à partir de ce code quand il est appelé de l'événement fieldChanged et fonctionne (les messages du journal montrent également dans l'exécution NS Log):

[Log] calculateConfigurations: before native log call 
[Log] calculateConfigurations: before iceUtil log call 

est ici la sortie de la console de appuyant sur la touche et ne fonctionne pas (il n'y a pas de messages du journal dans le journal d'exécution 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

Dans votre script client, vous devez utiliser la dépendance 'N/log' mais son nom dans la fonction de définition est' https'. 'log' n'est pas défini. –

Répondre

1

Il s'avère que ce n'était pas du tout un problème de chargement de module; c'était un problème dans le code N/log spécifiquement et l'environnement JS lors de l'appel à partir des différents endroits (événement client NS vs fonction JS arbitraire à partir d'un bouton personnalisé).

Lorsque log.debug() est appelé à partir du bouton, l'environnement JS a les variables suivantes définies et avec des valeurs: NLScriptIdForLogging et NLDeploymentIdForLogging, mais ceux-ci ne sont pas définis lors log.debug() a été appelé avec succès de l'événement client NS.

Si vous exécutez la commande suivante avant d'appeler log.debug(), il fonctionnera avec succès à partir du code de bouton:

delete NLScriptIdForLogging; 
delete NLDeploymentIdForLogging; 

Je ne suis pas sûr de ce que ceux-ci tentent de le faire, donc je suis en train de vérifier pour eux et ignorer l'appel log.debug() (ou l'acheminer vers la console JS si elle est présente).

Cela ressemble à un bug NS. Est-ce que quelqu'un sait comment je peux le signaler?

0

"Le premier appel aux bombes iceUtil.logDebug." C'est incroyablement vague. Publiez le résultat de l'erreur (plus important encore, l'erreur principale et la première ligne de la trace de la pile qui fait référence à votre propre code) pour donner aux utilisateurs des indications sur la façon de rechercher votre bogue dans votre code.

Même sans l'erreur réelle, je dirais que cette ligne est incroyablement suspecte:

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

Je ne sais pas ce que le code sous-jacent est que les processus de votre appel à context.form.addButton, mais je soupçonne que de la propriété nom functionName que la seule valeur valide à lui donner est un [String] contenant le nom d'une fonction dans la portée de context. Au lieu de cela, vous essayez très fort d'effectuer une sorte de création de fonction dynamique qui n'a probablement aucun sens pour la méthode addButton() que vous appelez.

D'où vient context.form.addButton? Il n'est pas natif et n'a aucune référence évidente à partir de votre exemple de code. Cette méthode est-elle fournie par une bibliothèque que vous n'avez pas mentionnée?

+0

Merci, j'ai mis à jour le message original avec la sortie de la console et la trace de la pile des erreurs, et également supprimé le paramètre transmis comme vous le suggérez, mais j'ai toujours le problème. – josh

0

La propriété functionName de addButton n'attend que le nom de la fonction. Je ne crois pas que vous pouvez invoquer la fonction et passer des paramètres comme ça.

Votre gestionnaire de clic devra lire l'ID de l'enregistrement en cours à partir du context ou en utilisant le module N/currentRecord de NetSuite.

+0

Merci pour la suggestion. Je l'ai changé pour ne pas passer le param (avec et sans parens) et il bombes toujours de la même manière. (BTW, j'ai obtenu cette technique à partir d'un commentaire dans [ce blog] (https://ursuscode.com/netsuite-tips/suitescript-2-0-quickstart-samples/#comment-3159860869)). – josh

+0

FYI, j'ai mis à jour le message original avec un code plus simple qui n'essaie pas de passer le paramètre. – josh

0

Vous rencontrez probablement un problème en raison de la mise à jour de la configuration d'objet requise dans NetSuite.Ce serait un peu difficile à taper, veuillez donc vous référer à la documentation de NetSuite here pour les détails. Si cela ne donne pas assez de contexte pour votre situation, référez-vous aux notes de version 2017.2, pages 67 et 68. J'espère que cela vous aidera.