문제 상황
주소 입력 필드처럼, 직접 타이핑은 막고 주소 검색 팝업으로만 값을 선택하게 해야 하는 경우가 있다.
editable="false"를 쓰면 가장 쉬운 방법이지만, UI가 회색으로 비활성화되어 보이는 문제가 있다.readonly 속성은 값 세팅 시점에 따라 의도치 않게 동작하기도 한다.
해결 방법 — initReadInput
핵심 아이디어:
포커스가 잡히는 순간 즉시 blur()를 호출해서 키보드 입력을 원천 차단.
전체 코드
/**
* Suggestion 없는 Input 필드를 읽기전용으로 처리
* - editable=false처럼 UI가 비활성화되어 보이지 않고,
* 겉모습은 일반 Input이지만 타이핑이 불가능한 상태
*
* @param {object} that - Controller의 this
* @param {string|string[]} inputArry - Input ID (단일 string 또는 string 배열)
*
* 사용법:
* CommonSuggestions.initReadInput(this, "addressInput");
* CommonSuggestions.initReadInput(this, ["addressInput", "detailAddressInput"]);
*/
initReadInput: function(that, inputArry) {
if (!Array.isArray(inputArry)) {
inputArry = [inputArry];
}
inputArry.forEach(function(inputId) {
var oInput = getById(that, inputId);
if (!oInput) return;
if (!oInput.getShowSuggestion || !oInput.getShowSuggestion()) {
oInput.addEventDelegate({
onAfterRendering: function() {
var $input = oInput.$().find("input");
$input.off("focus.readonly");
$input.on("focus.readonly", function() {
this.blur();
});
}
});
}
});
}
코드 포인트
1. 단일 ID / 배열 ID 모두 지원
if (!Array.isArray(inputArry)) {
inputArry = [inputArry];
}
문자열 하나를 넘겨도, 배열로 넘겨도 동일하게 처리.
2. Suggestion 없는 Input에만 적용
if (!oInput.getShowSuggestion || !oInput.getShowSuggestion()) {
initSuggestionInputs로 자동완성 처리된 Input은 별도 EDITABLE 모델 로직이 동작하므로 제외.
3. onAfterRendering에서 이벤트 바인딩
SAP UI5는 렌더링마다 DOM이 새로 생성되기 때문에, onAfterRendering 안에서 이벤트를 바인딩해야 안전.
이벤트 네임스페이스 focus.readonly를 사용하면 off("focus.readonly")로 해당 이벤트만 정확히 제거 가능 → 중복 바인딩 방지.
4. this.blur() — 포커스 즉시 제거
$input.on("focus.readonly", function() {
this.blur();
});
포커스가 잡히는 순간 blur() 호출 → 키보드 입력 원천 차단.
사용 방법
// onAfterRendering 또는 데이터 바인딩 직후
CommonSuggestions.initReadInput(this, "addressInput");
// 여러 개 동시 처리
CommonSuggestions.initReadInput(this, ["addressInput", "detailAddressInput"]);
방법 비교
| 방법 | 비활성화 UI | 타이핑 차단 | 값 세팅 가능 |
|---|---|---|---|
editable="false" |
회색 처리됨 | O | O |
readonly 속성 |
X | O | 경우에 따라 다름 |
initReadInput |
X (정상 외관 유지) | O | O |
팁: jQuery 이벤트 네임스페이스(
.readonly)를 활용하면off()로 특정 이벤트만 제거 가능 → 이벤트 중복 바인딩 버그 예방.
'SAP(UI5-Fiori)' 카테고리의 다른 글
| Grid 테이블 행(Row) 조건별 스타일 동적 적용 방법 (0) | 2026.06.16 |
|---|---|
| 필수 입력값(Required) 상태에 따른 커스텀 스타일 자동 제어 방법 (0) | 2026.06.16 |
| Grid 테이블 CSS 높이 커스텀 시 스크롤 버그 해결법 (0) | 2026.06.16 |
| 구글 Antigravity IDE에서 SAP & CAP 개발 환경 구축 (0) | 2026.06.16 |