LVRS Storyboard Frame
backend/ViewModels.svx
Path: backend/ViewModels.svx
ViewModels
위치: backend/state/viewmodelregistry.h / backend/state/viewmodelregistry.cpp
ViewModels는 싱글턴 레지스트리이자 MVVM 모델 객체에 대한 소유권 게이트입니다.
목적
- 키로 모델 객체를 등록합니다.
- 뷰 ID를 키에 바인딩합니다.
- 단일 작성자 소유권 의미 체계를 적용합니다.
속성
keys: stringListviews: stringListbindings: mapowners: maplastError: string
등록 API
set(key, object)get(key)remove(key)clear()
바인딩 및 소유권 API
bindView(viewId, key, writable = false)unbindView(viewId)getForView(viewId)keyForView(viewId)claimOwnership(viewId, key)releaseOwnership(viewId, key?)canWrite(viewId, key?)ownerOf(key)
자산 액세스 API
updateProperty(viewId, property, value)updatePropertyByKey(viewId, key, property, value)readProperty(viewId, property)
가드 의미론 작성
다음과 같은 경우 쓰기 업데이트가 실패합니다.
- 보기 ID가 비어 있습니다.
- 뷰에는 바인딩이 없습니다.
- 뷰는 대상 키의 소유자가 아닙니다.
- 키/객체/속성이 잘못되었습니다.
실패하면 API는 false를 반환하고 lastError를 업데이트합니다.
사용예
import LVRS 1.0 as LV
Component.onCompleted: {
LV.ViewModels.set("Dashboard", dashboardVm)
LV.ViewModels.bindView("DashboardPage", "Dashboard", true)
}
function setStatus(nextStatus) {
if (!LV.ViewModels.updateProperty("DashboardPage", "status", nextStatus))
console.warn(LV.ViewModels.lastError)
}
내부 행동 참고 사항
- 토큰은 트림 정규화됩니다.
- 키가 사라지면 오래된 바인딩/소유자가 정리됩니다.
- 레지스트리에 부모로 지정된 객체는 키 참조가 모두 사라지면 자동으로 처분될 수 있습니다.
확장된 예: 명시적인 소유권 이전
import LVRS 1.0 as LV
function transferOwner(fromView, toView, key) {
LV.ViewModels.releaseOwnership(fromView, key)
if (!LV.ViewModels.claimOwnership(toView, key))
console.warn(LV.ViewModels.lastError)
}
체크리스트 검토
- 모든 쓰기 가능한 뷰에는 명시적인 소유권 주장이 있어야 합니다.
- 읽기 전용 뷰는
writable=false와 바인딩되어야 합니다. lastError는 쓰기 실패에 대한 개발자 도구에 표시되어야 합니다.
FAQ
Q. 2 뷰가 동시에 하나의 키에 쓸 수 있나요? A. 아니요. 소유권 모델은 계약상 단일 작성자입니다.