【问题标题】:Suitescript 2.0 addButtonSuitescript 2.0 添加按钮
【发布时间】:2016-06-14 19:09:19
【问题描述】:

我有一个带有子列表按钮的套件,我试图让该按钮在自定义模块上执行功能。我无法让它工作。我收到一个错误“无法调用未定义的方法”接收“” 有什么想法吗?

添加按钮的代码片段

define(['N/error', 'N/record', 'N/search', 'N/ui/serverWidget','./lib1'],


function(error, record, search, ui, lib1) {
//... some code here
searchSublist.addButton({
			id: 'custpage_recievepayment', 
			label: 'Receive Payment',
			functionName: "lib1.receive()"});
}

自定义模块片段

define(['N/redirect'],
		function(redirect){
	function receive(){

    		var deal = '497774';
    		var url = redirect.toSuitelet({
    			scriptId: 'customscript_deal_entry_2_0',
    			deploymentId: 'customdeploy1',
    			returnExternalUrl: false,
    			params: {
    				prevdeal: url
    			}
    		})
	}
	});

【问题讨论】:

    标签: netsuite suitescript


    【解决方案1】:

    我能够在不使用客户端脚本或将其导出到建议的全局对象的情况下使其工作。关键是修改我的自定义模块以返回我想在按钮上使用的功能并使用 form.clientScriptFileId 调用自定义模块文件

    //suitelet
    define(['N/error', 'N/record', 'N/search', 'N/ui/serverWidget'],
    function(error, record, search, ui) {
       
    	// other code here
    		form.clientScriptFileId = 78627;//this is the file cabinet internal id of my custom module
    		var searchSublist = form.addSublist({
    			id: 'custpage_deals',
    			type: ui.SublistType.LIST,
    			label: 'Deals'
    		})
    		searchSublist.addButton({
    			id: 'custpage_receivepayment', 
    			label: 'Receive Payment',
    			functionName: "receive()"
    				});
      
      //custom module
      
      define(['N/url','N/error'],
    
    function(url, error) {
    	return{
        	  receive: function(){
        				
         //function code here
    	}		           
    
    })

    【讨论】:

    • 这对我也有用。您是否成功使用了 form.clientScriptModulePath() 方法?顺便说一句,我注意到你在 functionName 属性中有括号。当我这样做时,我在控制台中记录了一个错误。在 Sources 选项卡中进行快速文本搜索会发现 function(mod){ mod.myFunc()(); }。我应该更好地工作为functionName: "receive"
    【解决方案2】:

    对于suitescript 2.0,您需要定义实际包含您的函数的文件。

    /**
     *@NApiVersion 2.x
     *@NScriptType UserEventScript
     */
    define([],
      function() {
        function beforeLoad(context) {
          if(context.type == "view") {
            context.form.clientScriptFileId = 19181;
            context.form.addButton({
              id: 'custpage_dropshippo',
              label: 'Generate Dropship PO',
              functionName: 'generateDropshipPurchaseOrder'
            });
          }
        }
        return {
          beforeLoad: beforeLoad,
        };
      }
    );

    在该示例中,值 19181 是以下文件的文件柜 ID(不需要部署,但需要脚本记录):

    /**
     *@NApiVersion 2.x
     *@NScriptType ClientScript
     */
    define([],
      function() {
        function pageInit() {
        }
        function generateDropshipPurchaseOrder() {
          console.log("foo");
        }
        return {
          pageInit: pageInit,
          generateDropshipPurchaseOrder: generateDropshipPurchaseOrder
        };
    });

    【讨论】:

      【解决方案3】:

      感谢您分享此信息。我终于通过使用“文件柜内部 id”而不是“客户端脚本”内部 id 使它工作,正如这个线程中有人提到的那样。

      我还通过 chrom 开发工具注意到“scriptContext”并没有像我预期的那样自动传递给客户端脚本函数。所以我不得不通过以下方式在客户端脚本中手动传入我需要的数据:

      function beforeLoad(scriptContext) {
          var form = scriptContext.form;
          form.clientScriptFileId = 33595032;
          form.addButton({
              id: 'custpage_reprocessinvoice',
              label: 'Reprocess Invoice',
              functionName: 'reprocess(' + scriptContext.newRecord.id + ')'
          });
      }
      

      希望这可以帮助某人并节省他/她的时间。

      【讨论】:

      • 这行得通!但请注意,“文件柜内部 id”可能会根据您是在沙盒还是生产环境中发生变化。
      【解决方案4】:

      按钮点击处理程序在 2.0 中是一个问题(至少在我看来)。您收到此错误是因为 lib1 未在客户端定义。

      我要做的是创建一个客户端脚本,将我的点击处理程序导出到全局对象以使其可访问。比如:

      // Client script
      define(['my/custom/module'], function (myModule) {
          window.receive = myModule.receive;
      });
      
      // Suitelet
      define(...
          // some code...
          searchSublist.addButton({
              id: 'custpage_recievepayment', 
              label: 'Receive Payment',
              functionName: "receive"
          });
      // other code...
      

      导出到全局空间并不理想,当然也不是一般的好习惯,但我不知道有任何其他方法可以在单击按钮时引用模块内的函数。

      【讨论】:

      • 感谢您的帮助!我应该为客户端脚本使用什么入口点。我假设我需要输入 window.receive = myModule.receive 如果我只是从 pageinit 入口点调用 myModule.receive 我可以让代码 sn-p 工作,但我只希望它在推送时运行按钮,所以我在 pageinit 函数下添加了一个函数,以便在页面加载时它不会触发,但是我马上回到我开始的地方我无法调用嵌套在 pageinit 函数下的新函数。
      • 我认为您根本不需要任何事件处理程序;我已经成功使用上面显示的脚本。不过,它基本上等同于pageInit
      • 我已经尝试了您的确切代码,只是更改了文件柜中文件的路径。该文件名为 lib.js,与套件位于同一文件夹中,因此我使用的是 define(["./lib"]) 我收到以下错误:未捕获的类型错误:无法读取未定义的属性“接收”
      【解决方案5】:

      在多次尝试后仍未使其正常工作后,我向 Netsuite 提交了一个缺陷(缺陷 390444),他们刚刚告诉我该问题现已得到修复和测试,并将在下一个主要版本中发布。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多