LVRS Storyboard Frame

backend/ViewModels.svx

Path: backend/ViewModels.svx

Last modified:

ViewModels

위치: backend/state/viewmodelregistry.h / backend/state/viewmodelregistry.cpp

ViewModels는 싱글턴 레지스트리이자 MVVM 모델 객체에 대한 소유권 게이트입니다.

목적

  • 키로 모델 객체를 등록합니다.
  • 뷰 ID를 키에 바인딩합니다.
  • 단일 작성자 소유권 의미 체계를 적용합니다.

속성

  • keys: stringList
  • views: stringList
  • bindings: map
  • owners: map
  • lastError: 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. 아니요. 소유권 모델은 계약상 단일 작성자입니다.