2016-06-14 8 views
3

Ich habe ein Suletlet mit einer Sublist-Schaltfläche und ich versuche, die Schaltfläche zum Ausführen einer Funktion auf einem benutzerdefinierten Modul zu erhalten. Ich kann es nicht zur Arbeit bringen. Ich erhalte einen Fehler "Kann Methode nicht anrufen" erhalten "von undefined" Irgendwelche Ideen?Suitescript 2.0 addButton

Code-Snippet hinzufügen Taste

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

 

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

Snippet von benutzerdefinierten Modul

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

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

Antwort

0

Nachdem das nicht immer nach mehreren arbeiten Ich habe versucht, einen Fehler mit Netsuite (Defect 390444) zu melden und sie haben mir gerade gesagt, dass dies nun behoben und getestet wurde und in der nächsten Hauptversion sein wird.

+0

Dies ist keine Lösung: Die Lösung ist die Verwendung von Form.clientScriptModulePath oder form.clientScriptFileId: https://netsuite.custhelp.com/app/answers/detail/a_id/ 61236/kw/functionName und https://netsuite.custhelp.com/app/answers/detail/a_id/63272/kw/serverWidget%20addButton –

1

Button-Klick-Handler ist etwas von einem Problem (zumindest in meiner Meinung nach) in 2.0. Sie erhalten diesen Fehler, weil lib1 nicht auf der Clientseite definiert ist.

Was ich tun musste, ist ein Client-Skript zu erstellen, das meine Click-Handler zum globalen Objekt exportiert, um sie zugänglich zu machen. Etwas wie:

// 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... 

Es ist nicht ideal, und schon gar nicht ein gute Praxis im Allgemeinen auf den globalen Raum zu exportieren, aber ich kenne keine andere Art und Weise eine Funktion innerhalb eines Moduls auf einer Schaltfläche klicken zu verweisen.

+0

Vielen Dank für Ihre Hilfe! Welchen Einstiegspunkt sollte ich für das Client Script verwenden? Ich würde voraussetzen, dass ich window.receive = myModule.receive eingeben müsste Ich kann das Code-Snippet funktionieren, wenn ich myModule.receive nur vom pageInit-Einstiegspunkt aus anrufe, aber ich möchte es nur auf Knopfdruck so ausführen Ich habe eine Funktion unter der page-init-Funktion hinzugefügt, so dass sie nicht beim Laden der Seite ausgelöst wird, aber dann bin ich wieder da, wo ich angefangen habe. Ich kann die neue Funktion nicht unter der Funktion paginit aufrufen. – kdub

+0

Ich glaube nicht, dass Sie überhaupt einen Event-Handler benötigen; Ich war erfolgreich mit genau dem oben gezeigten Skript. Es ist im Grunde gleichbedeutend mit "pageInit". – erictgrubaugh

+0

Ich habe Ihren genauen Code ausprobiert, außer den Pfad zu der Datei, die ich im Archiv habe. Die Datei heißt lib.js und befindet sich im selben Ordner wie das Suitlet, also verwende ich define (["./ lib"]) Ich erhalte den folgenden Fehler: Uncaught TypeError: Kann die Eigenschaft 'receive' von undefined – kdub

2

Ich konnte dies mit dem Client-Skript arbeiten oder es zu dem globalen Objekt, das vorgeschlagen wurde, exportieren. Der Schlüssel war mein benutzerdefinierten Modul zu modifizieren, um die Funktion, die ich auf den Button benutzen wollte zurückzukehren und die benutzerdefinierten Modul Aufruf der Datei mit form.clientScriptFileId

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

 
function(url, error) { 
 
\t return{ 
 
    \t receive: function(){ 
 
    \t \t \t \t 
 
    //function code here 
 
\t } \t \t    
 

 
})

+1

Das hat auch für mich funktioniert. Haben Sie erfolgreich die form.clientScriptModulePath() -Methode verwendet ?. Übrigens habe ich bemerkt, dass Sie Parens in der Eigenschaft functionName haben. Als ich das gemacht habe, hatte ich einen Fehler bei der Konsole. Eine schnelle Textsuche in der Registerkarte Quellen entdeckt 'function (mod) {mod.myFunc()(); } '. Ich sollte besser funktionieren als 'functionName:" receive "' – tzvi

0

Vielen Dank für den Austausch dieser Informationen. Ich habe es endlich geschafft zu arbeiten, indem ich die "interne ID des Archivs" und nicht die interne ID des "Client-Skripts" benutzte, wie von jemandem in diesem Thread erwähnt.

Auch habe ich durch das Chrom-Entwickler-Tool bemerkt, dass "scriptContext" nicht automatisch an die Client-Skript-Funktion übergeben wird, wie ich erwartet hatte. Also musste ich manuell in die Daten zu übergeben i in dem Client-Skript durch die folgende Art und Weise müssen:

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

Hope this jemand helfen kann, und speichern Sie ihn/sie ein wenig Zeit.

+0

das funktioniert! Aber Vorsicht, die "interne ID des Archivs" kann sich ändern, je nachdem, ob Sie sich in der Sandbox oder in der Produktion befinden. –

1

Für suitescript 2.0 müssen Sie die Datei definieren, die Ihre Funktion enthält.

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

In diesem Beispiel 19181 der Wert ist, den Aktenschrank ID der folgenden Datei (die keinen Einsatz benötigt aber einen Skript Datensatz benötigt):

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