IBSheet.create 함수로 초기화시 주의해야 할 사항은 아래와 같다.


1. 시트객체 중복 문제

  • IBSheet.create 시 id값은 반드시 UNIQ 하게 설정해야 한다.
IBSheet.create({
    id: "sheet", // 생성할 시트의 id
});

id값이 중복으로 설정될 경우 아래와 같은 경고 메세지가 표출 된다.


[IBSheet.create({id:'sheet'})] Can't creation : Duplicate sheet_id already exists.  "sheet"


SPA(Single Page Application)  또는 팝업 페이지에서 시트를 항상 새로 그려야 할때 UNIQ 하게 id를 지정 할 수 없다면, dispose 또는 disposeAll 함수로 DOM과 메모리에서 IBSheet 삭제하고 IBSheet.create를 다시 호출 하는 형태로 구현 되어야 한다.

let hasSheet = IBSheet.hasSheet("sheet"); //id 값이 sheet인 객체가 있는지 확인

if(hasSheet){ //시트객체가 있으면
    IBSheet["sheet"].dispose(); //IBSheet라는 전역변수에 모든 시트가 배열로 관리된다.
}

2. 시트를 그릴 DIV가 없을때 문제

  • IBSheet.create 시 el에 설정한 DIV 객체가 없거나 DIV객체가 DOM 트리를 완성create 함수를 호출하게 되면 아래 오류를 만나게 된다.
  • IBSheet는 el 에 해당하는 DIV에 html을 append 하는 형태로 동작하기 때문에 반드시 el에 해당하는 DIV가 랜더링이 완료된 시점create  함수를 호출해야 한다.
IBSheet.create({
    id: "sheet", // 생성할 시트의 id
    el: "sheetDiv" //시트를 생성할 Dom 객체 및 id
});

[IBSheet.create({id:'sheet'})] 'el' argument must be HtmlDivElement or HtmlDivElement's id .


3. 비동기 동작 문제(중요)

  • IBSheet.create 함수는 비동기로 동작한다.
  • create 함수 호출 이후 시트 객체에 접근하는 로직이 있을 경우 pc 성능에 따라 동작을 보장 할 수 없다.
IBSheet.create({
    id: "sheet", // 생성할 시트의 id
    el: "sheetDiv", 
    options: opt,
});

sheet.doSearch("/search.do"); //조회 데이터가 표시 될수도 있고 안될수도 있음

객체 초기화 하자마자 시트객체에 접근하는 로직을 구현해야 한다면 반드시 onRenderFirstFinish / onRenderFirstFinishAll 이벤트에서 작업하거나 IBSheet.create 함수가 동기로 동작하도록 sync를 설정한다.


[sync] - sync 예제

IBSheet.create 함수가 동기로 동작한다.

조회가 늦으면 IBSheet도 늦게 그려진다.

var opt = {
    //각 열에 대한 정의 (열의 이름, 유형(Type), 포맷(Format)등을 설정)
    Cols:[
        {Header: "이름", Name: "sa_nm", Type: "Text"},
        .....
    ]
};

//시트객체 생성
IBSheet.create({
id: "sheet", // 생성할 시트의 id
el: "sheetDiv", // 시트를 생성할 Dom 객체 및 id
options: opt, // 생성될 시트의 속성
sync: 1          //시트 생성 동기로 동작
});

sheet.doSearch("/search.do"); 

[async ] - onRenderFirstFinish 예제 (추천)

IBSheet.create 함수가 비동기로 동작한다.

callback 인 onRenderFirstFinish 이벤트에서 시트가 그려지고 난 이후에 처리해야 할 코드를 작성한다.

var opt = {
    //각 열에 대한 정의 (열의 이름, 유형(Type), 포맷(Format)등을 설정)
    Cols:[
        {Header: "이름", Name: "sa_nm", Type: "Text"},
        .....
    ],
    Events :{
        onRenderFirstFinish : function(evtParm) {
            //시트가 다그려진 시점에 조회를 한다.
            evtParm.sheet.doSearch("/search.do"); 
        }
    }
};

//시트객체 생성
IBSheet.create({
id: "sheet", // 생성할 시트의 id
el: "sheetDiv", // 시트를 생성할 Dom 객체 및 id
options: opt // 생성될 시트의 속성
});

[async ] - onRenderFirstFinishAll 예제 (추천)

var opt = {
    //각 열에 대한 정의 (열의 이름, 유형(Type), 포맷(Format)등을 설정)
    Cols:[
        {Header: "이름", Name: "sa_nm", Type: "Text"},
        .....
    ]
};

//시트객체 생성
IBSheet.create({
id: "sheet", // 생성할 시트의 id
el: "sheetDiv", // 시트를 생성할 Dom 객체 및 id
options: opt // 생성될 시트의 속성
});

IBSheet.onRenderFirstFinishAll = function(obj){
   sheet.doSearch("/search.do"); 
};

4. IBSheet 관련 파일 여러번 호출시 문제

  • 하나의 DOM에 IBSheet 관련 파일이 한번만 호출되어야 한다.(ibsheet.js, main.css 등)
    아래 그림과 같이 팝업 화면을  기존의 dom에 append하여 보여지는 형태라면 팝업에서 IBSheet 관련 파일을 호출하면 안된다.