2016-06-14 2 views
3

나는 하위 목록 단추가있는 스위트 렛이 있으며 사용자 지정 모듈에서 기능을 실행하는 단추를 얻으려고합니다. 나는 그것을 작동시킬 수 없다. "메서드를 호출 할 수 없습니다."라는 메시지가 나타납니다. "정의되지 않음"을 수신합니다. 아이디어가 있습니까? 이상에서 문제의 뭔가 (코드Suitescript 2.0 addButton

발췌문 버튼

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()"}); 
 
}

코드 조각 사용자 정의 모듈의

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 });

답변

0

여러 후 작동이을받지 후 내가 버튼을 사용하여 원하는 기능과 form.clientScriptFileId와 사용자 정의 모듈 파일을 호출을 반환 내 사용자 지정 모듈을 수정했다 나는 Netsuite (결함 390444)에 결함을 제기하려고 시도하고 있으며, 이제는이 문제가 수정되어 테스트되었고 다음 주요 릴리스에 포함될 것이라고 내게 알려주었습니다.

+0

이것은 해결책이 아닙니다. 해결책은 Form.clientScriptModulePath 또는 form.clientScriptFileId를 사용하는 것입니다. https://netsuite.custhelp.com/app/answers/detail/a_id/ 61236/kw/functionName 및 https://netsuite.custhelp.com/app/answers/detail/a_id/63272/kw/serverWidget%20addButton –

1

버튼 클릭 핸들러를 추가하는 것입니다 내 의견) 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... 

그것의 글로벌 공간으로 수출,하지만 난 버튼 클릭에 모듈 내에서 함수를 참조하는 다른 방법을 모르는 일반적으로 적합하지, 그리고 확실히 좋습니다.

+0

도움 주셔서 감사합니다. 클라이언트 스크립트에 대해 어떤 진입 점을 사용해야합니까? 나는 window.receive = myModule.receive를 입력 할 필요가 있다고 가정 할 것이다. 나는 pageinit 엔트리 포인트에서 myModule.receive를 호출하면 코드 스 니펫을 얻을 수 있지만 버튼 만 누르면 실행되도록하고 싶다. pageinit 함수 아래에 함수를 추가하여 페이지가로드 될 때 시작되지 않지만 시작한 곳으로 돌아가서 pageinit 함수 아래에 중첩 된 새 함수를 호출 할 수 없습니다. – kdub

+0

이벤트 처리기가 전혀 필요 없다고 생각합니다. 위에 표시된 스크립트로 성공했습니다. 그것은 기본적으로'pageInit'과 같습니다. – erictgrubaugh

+0

파일 캐비닛에있는 파일의 경로가 변경된 것을 제외하고 정확한 코드를 사용했습니다. 이 파일은 lib.js라고하며 suitelet과 같은 폴더에 있습니다. 그래서 define ([ "./ lib"])을 사용하고 있습니다. 다음과 같은 오류가 나타납니다 : Uncaught TypeError : 'receive'속성을 읽을 수 없습니다 undefined – kdub

2

클라이언트 스크립트를 사용하거나 제안 된 전역 개체로 내보낼 수 있습니다. 열쇠는

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

저 역시 저에게 효과적이었습니다. form.clientScriptModulePath() 메서드를 사용하여 성공 했습니까? btw 나는 functionName 속성에 괄호가 있음을 확인했습니다. 내가 그 일을 할 때 콘솔에 오류가 기록되었습니다. 소스 탭에서 빠른 텍스트 검색은'function (mod) {mod.myFunc()(); }'. 'functionName : "receive"로 더 잘 작동해야합니다. – tzvi

0

이 정보를 공유해 주셔서 감사합니다. 마침내이 스레드의 누군가가 언급 한 것처럼 "클라이언트 스크립트"내부 ID가 아닌 "파일 캐비닛 내부 ID"를 사용하여 작업하도록 만들었습니다.

또한 "scriptContext"가 클라이언트 스크립트 함수에 자동으로 전달되지 않는다고 크롬 개발자 도구를 통해 알았습니다. 그래서 내가 직접 내가 다음과 같은 방법을 통해 클라이언트 스크립트에서 필요한 데이터를 전달했다 :이 시간의/그녀의 조금 그 사람을 도와 저장할 수 있습니다

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

희망을.

+0

이 작동합니다! 샌드 박스 또는 프로덕션 환경에 따라 "파일 캐비닛 내부 ID"가 변경 될 수 있습니다. –

1

suitescript 2.0의 경우 실제로 함수가 포함 된 파일을 정의해야합니다.

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

/** 
 
*@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입니다