넥사크로플랫폼은 기본 JavaScript 스펙을 따르며, 아래 내용은 자주 물어보는 내용을 위주로 정리하였습니다.
http://docs.tobesoft.com/system_requirements#9248a28530c3a1f8 3.1.3국제 표준 준수 사항
부동소수점
데이타 처리
null 데이타 체크
숫자타입이 null일때 0으로 세팅하는 방법
수식계산시 NaN, undefined
expr등을 이용하여 계산 시 숫자 처리 확인 방법입니다.
스크립트를 이용한 컴포넌트 속성값 설정
예) 컴포넌트.set_value("111") ; //속성에 값을 세팅할때는 set_ + 속성명을 기술한다. trace(컴포넌트.value) ; //값을 가져올때는 속성명만 지정한다.
스크립트 소스에 set_ 시작하는 문장이 있다면 속성 값을 변경 했음을 알 수 있다.
이벤트에서 Object 값 접근 시 주의사항
컴포넌트너트에 Dataset이 바인딩 되어 있는 경우에는 값 참조시 컴포넌트를 접근하지 말고 Dataset을 접근하여 값을 참조합니다.
obj, 컴포넌트 값 참조시 Dataset과 바인딩 되어 있는 경우 Dataset을 접근합니다.
이벤트에서 스크립트 작성시 object를 이용하여 값을 참조하지 말고 Dataset을 이용하여 코딩을 해야Object명이 바뀌어도 유연하게 대처 가능합니다.
Object명을 직접 기입한 경우
this.Button01_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { this.Button01.set_text("Hello"); };
this.Button01의 id가 변경되면 소스를 수정해야 합니다.
Event에 포함된 obj 파라메터 값을 이용한 경우
this.Button01_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { obj.set_text("Hello"); };
Prefix 사용
명명규칙
주석처리
일반적으로 자바스크립트를 작성시 주석 및 들여쓰기를 생략하는 경우가 많은데 넥사크로는 다음의 특징을 가지기 때문에 주석 및 들여쓰기를 필요시 사용을 권장합니다.
넥사크로플랫폼으로 개발된 소스는 .xfdl의 XML포멧형태로 결과물이 생선이 되는데
이 파일 포멧은 웹브라우저를 통해 실행시 표현이 불가능하기 때문에 웹브라우저가 인식될 수 있게
.js로 변환해 주는 Generate과정을 거치게 된다.
이 과정을 거치게 되면 원본(.xfdl)파일이 Javascript(js) 포멧으로 변경이 되며 실제 운영시에는 js파일을 서버에 반영하여 운영하게 된다.
즉 원본소스와 Generate된 Js파일이 분리가 됩니다.
Generate과정에서 주석 및 들여쓰기를 삭제할 수 있는 옵션이 제공되며,
따라서 원본소스는 주석 및 들여쓰기를 정석대로 작성을 권장합니다.
Option -> Deploy-> Compress Options의 Compress JS file
Compress JS files 체크박스를 선택하고 Deploy하면 white space, comments를 삭제 가능합니다.
날짜함수
getDate를 포함한 모든 함수 날짜함수 사용해 시당 시간이 의미하는 것은 서버 시간이 아니므로 사용자PC에 따라 달라질 수 있습니다.
getDate 사용시 해당 시간은 서버시간이 아닌 사용자 PC의 시간을 나타냅니다.
함수 존재여부
this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { var str = "fnTest"; if (this.lookup(str) == undefined) { alert("존재하지 않음"); } else { if (typeof this[str] == "function") alert("존재함"); this[str].call(); } } this.fnTest = function() { alert("함수테스트"); }
for in Loop 구문을 이용한 objects 값 얻는 방법
var oArg = {b:"aaaaa",aaa:"bbbbb"}; for(a in oArg) { trace(a + "==" + oArg[a]); }
결과 : b==aaaaa aaa==bbbbb
Expr 사용시 주의사항
Expr은 Dataset바인딩 및 메소드 등으로 사용하지 않고 실행하고자 하는 문자열 형태로 조합하여 표현식을 작성할 수 있습니다. 이때 Expr 사용지 주의사항을 체크해 봅니다.
사용예)
var sText = this.EditBox.text; this.Dataset1.filter("String(FULL_NAME).indexOf('" + sText + "')>-1");
위의 스크립트는 사용자로 부터 EditBox컴포넌트를 통해 입력받은 데이타를 이용하여 Expr를 작성한 소스로 스크립트만 보면 크게 문제가 없어보이나, 사용자가 어떤 값을 입력하느냐에 따라 정상동작 또는 오동작이 발생할 수 있습니다.
만약 사용자가 EditBox에 입력한 text값에 싱글쿼테이션(') 값을 포함하는 경우 오류가 발생할 수 있습니다.
nexacro (23712)> UD 9:55:41:384 SyntaxError: missing ) after argument list
in eval script(undefined)
해결방법
사용자가 EditBox를 통해 싱글퀘테이션(') 값이 포함되어 있는 경우를 감안하여 Expr를 작성해야 합니다.
// 조건값에 '이 포함되어 있는 경우 오류가 발생할 수 있습니다. // 컬럼 Type이 String이 아닌 경우를 대비하여 String으로 감싸줍니다. var sText = this.EditBox.text; this.Dataset1.filter("String(FULL_NAME).toUpperCase().indexOf('" + nexacro.replaceAll(sText,"'","\\'").toUpperCase() + "') >= 0");
참고사항
해당 내용은 Expr뿐 아니라 스크립트를 작성하는데 있어 문자열 조합을 하는 경우 모두 해당됩니다.
변수선언
넥사크로플랫폼에서 Script 작성시 사용 가능한 변수 선언방식은 아래와 같습니다.
var : Scope 미정된 경우 Form의 Member변수가 아님 따라서 폼의 컴포넌트 또는 다른 폼에서 해당 변수를 참조할 수 없습니다.
this.변수 : Form의 Member변수로 폼의 컴포넌트 및 다른 폼에서 접근이 가능합니다.
최근 브라우저 및 ECMA스펙이 업그레이드 되면서
let, const등 더 많은 선언방식을 사용할 수 있으나, 넥사크로플랫폼이 실행될 수 있는
웹(IE)브라우저는 IE8이므로 해당 버전부터 사용할 수 있는 선언방식을 취하는 것이 좋습니다.
만약 변수선언시, var, 또는 this를 생략하고 변수를 기입하게 되면 해당 변수의 Scope는
Global영역으로 할당되므로 권장하지 않습니다.
변수 선언시 주의사항
서비스 리턴 변수 받기
transaction메소드를 이용하여 서비스를 호출하는 경우 callback함수에는 기본 3개의 인자만 사용할 수 있으며, 만약 서버에서 ErrorCode, ErrorMsg 이외에 추가적으로 보내주는 변수가 있다면 화면단에서는 다음과 같이 변수를 선언해야 서버에서 넘겨주는 값을 정상적으로 받을 수 있습니다.
//서버 samplexml.jsp에서 sVar1를 넘겨주는 경우를 가정 PlatformData out_pData = new PlatformData(); VariableList out_varList = out_pData.getVariableList(); out_varList.add("ErrorCode", nErrorCode); out_varList.add("ErrorMsg" , strErrorMsg); out_varList.add("out_var" , sVar1);
this.transaction( "MyService01","DataSrv::samplexml.jsp","input1=Dataset02","Dataset03=output1","a=b","callbackFunction"); ... 중략 ... this.sVal1 = ""; this.callbackFunction = function(svcid, ecd, emsg) { trace(this.sVal1); }
폼의 멤버변수로 선언을 해주고 반듯이 초기화를 해 주어야 한다.
초기화 하지 않으면 값을 받을 수 없다.
Environment의 Variables 와 Application Variables 차이
Environment의 Variables
Environment의 Variables에 선언된 변수는 개발자가 값을 설정하면, 개발자가 지워주도록 코딩을 해야 합니다. 만약 값을 지우는 코딩이 없다면 해당 값은 Application을 재시작 하거나 또는 PC를 재 부팅해도 계속 값이 남아있게 됩니다.
Local Storage :
각 브라우저별로 관리되며, 값을 삭제하지 않는 경우 보안에 문제가 될 수 있으니 반듯이 지워주도록 한다. 또한 해당 변수값은 평문이 아닌 암호화된 데이타를 사용할 것을 권장합니다.
Application Variables
Application Variables에 선언된 변수는 우리가 흔히 알고 있는 Global변수라고 이해하면 됩니다. 즉 Application이 종료되면 해당 변수는 Environment와 같이 남아있지 않고 사라지게 됩니다.
넥사크로 17 변수 및 함수 접근방법
eval 함수 대체방법
eval를 사용하면 안되는 이유
eval은 어떤 코드라도 무조건 실행하기 때문에 보안 문제도 있습니다. 따라서 신뢰하지 못하거나 모르는 코드가 포함되어 있을 경우 절대로 사용해서는 안됩니다.
해결방법
eval함수를 이용하여 object 화 하는 방법
var strObj = this.grd_list.name; var objGrid = eval("this." + strObj); trace(objGrid + " : " + typeof objGrid);
위의 내용을 아래와 같이 변경가능
var sGridID = this.grd_list.name; var objGrid = this.components[sGridID]; trace(objGrid + " : " + typeof objGrid);
함수호출
var fn_ID = "fn_FuncCall"; eval("this." + fn_ID)(1,2);
위의 내용을 아래 두가지 방식으로 변경 가능
//String 으로 받은 functionID 를 호출 할 경우 //agument 의 경우 호출 받는 메소드에서 받는 갯수만큼 넣어주시면 됩니다. var fn_ID = "fn_FuncCall"; this[fn_ID].call(null, 1, 2);
var fn_ID = "fn_FuncCall"; this.lookup( fn_ID ).apply(null,[1,2]); //apply시 값 전달방식이 다름
eval 대체방법
var arrObj = eval("this.Tab00.Tabpage1.form").all; for(var i=0; i<arrObj.length;i++) { trace(arrObj[i].name); }
해결방법
var o = new Function("return this.Tab00.Tabpage1.form").call(this); var arrObj = o.all for(var i=0; i<arrObj.length;i++) { trace(arrObj[i].name); }
참고사항
eval은 사용하지 않는것이 좋다. eval을 사용하는 모든 코드는 성능, 보안, 버그 문제를 일으킬 수 있습니다. 만약 eval이 필요해지면 설계를 변경하여 eval이 필요 없게 만들어야 합니다.
최근 여러 사이트에서 소스를 재개발하는 사례가 발생하고 있습니다. 보안솔루션 업체에서 시큐어코딩 소스 점검에서 eval 스크립트 점검대상에 포함하고 있습니다.
Global 변수 설정 및 값 가져오는 방법
설정하는 방법
var objApp = nexacro.getApplication(); objApp.App_Var1 = "값 설정";
가져오는 방법
var objApp = nexacro.getApplication(); trace(objApp.App_Var1);
nexacro.getApplication은 현재 실행된 어플리케이션의 Application 오브젝트를 반환하는 메소드입니다.
Application을 통해 원하는 위치로 접근하기
해당 내용에 대한 게시글은 support.tobesoft.co.kr ->Community->Tip게시판->nexacro platform 17 (2677)번에 게시된 내용입니다.