1. 이벤트 범위 제한하기

IBSheet에서는 모든 이벤트(event)의 기본 동작 범위는 전체 행(헤더, 데이터, 필터, 그룹 포함) 입니다.


예를 들어, onClick, onAfterChange, onDblClick 등 모든 이벤트는 행 범위를 한정하지 않으면 시트 내의 모든 행에서 발생합니다.

즉, 필터 행이나 헤더 행을 클릭해도 동일한 이벤트가 호출됩니다.


따라서 이벤트 핸들러를 작성할 때 반드시 Kind 속성을 활용하여 이벤트 대상 행을 구분해야 합니다.



▼ Kind 종류



Kind는 각 행이 어떤 기능을 수행하는지를 구분하는 속성입니다.


특정 이벤트가 데이터 행에만 적용되어야 하는 경우, 반드시 아래처럼 Kind 조건문을 추가해야 합니다.


onClick: function (e) {
    if (e.row.Kind !== "Data") return; // 데이터 행이 아닐 경우 무시
    // 클릭 시 동작 처리
}

이 조건이 없을 경우, 필터행을 클릭했을 때도 동일한 로직이 실행되어

불필요한 조회나 변경이 일어날 수 있습니다.




2. 공통설정으로 이벤트 범위 제한하기(이벤트 오버라이드)

화면의 이벤트마다 개별적으로 조건을 추가하기 어렵거나 반복적인 코드를 줄이고 싶다면,

ibsheet-common.js에서 onBeforeCreate 이벤트를 사용하여 공통 처리를 할 수 있습니다.


예를 들어, 모든 시트의 onClick 이벤트에서 Filter 행을 제외하고자 할 때

각 시트마다 이벤트를 일일이 수정하지 않고도 아래와 같이 처리할 수 있습니다.

//IBSheet.create시 설정한 options 값을 가공할 수 있다.
_IBSheet.onBeforeCreate = function (init) {
    if (!init.options["Events"]) init.options["Events"] = {};
    init.options.PageEvent = {};
    
    //개별 화면에서 설정한 onClick 이벤트를 PageEvent에 저장하여 재사용할 수 있도록 기억
    if (init.options["Events"]["onClick"]) {
        init.options.PageEvent["onClick"] = init.options["Events"]["onClick"];
    }

    init.options["Events"]["onClick"] = function (e) {
        // ✅ 필터 행이면 더 이상의 처리를 하지 않는다. ✅
        if (e.row.Kind === "Filter") return;
        
        // PageEvent에 저장된 onClick 이벤트가 있으면 실행한다.
        if (e.sheet.options.PageEvent && e.sheet.options.PageEvent["onClick"]) {
            return e.sheet.options.PageEvent["onClick"](e);
        }
    };
    
    return init;
};