Skip to content

ViewModel 系统

ViewModel 系统为实现模型-视图-视图模型(MVVM)模式提供了基础类和装饰器。该系统通过 ViewModel 基类和相关装饰器实现响应式数据绑定、命令处理、验证和状态管理。

本页涵盖核心 ViewModel 实现、可观察属性、计算属性和状态管理功能。有关 ViewModel 和 UI 元素之间的数据绑定信息,请参见数据绑定。有关详细的命令系统功能,请参见命令系统。有关全面的装饰器用法,请参见装饰器

ViewModel 类架构

ViewModel 类作为框架中所有 ViewModel 的基类,继承了 Observable 以提供响应式功能,同时具备命令管理、验证和状态跟踪能力。

可观察属性

可观察属性是 ViewModel 中响应式数据绑定的基础。它们在值发生变化时自动通知观察者,并与验证和脏状态跟踪系统集成。

@observable 装饰器将常规属性转换为参与 MVVM 数据绑定系统的响应式属性:

功能实现方式位置
属性定义使用 Object.defineProperty 的 getter/settersrc/core/Decorators.ts:24-62
值存储私有键模式:_$src/core/Decorators.ts:16
变更检测在通知前比较新旧值src/core/Decorators.ts:30
验证集成调用 setProperty 方法进行验证src/core/Decorators.ts:32-46
观察者通知在值变更时调用 notifyObserverssrc/core/Decorators.ts:52-54

计算属性

计算属性从其他可观察属性派生其值,并在依赖项发生变化时自动重新计算。它们包含缓存机制以优化性能。

计算属性系统

组件用途实现方式
依赖数组指定哪些属性触发重新计算src/core/Decorators.ts:69
缓存存储存储计算值:computed$src/core/Decorators.ts:81-82
有效性标志跟踪缓存有效性:computed_valid$src/core/Decorators.ts:82
失效逻辑在依赖项变化时使缓存失效src/core/Decorators.ts:421-433
元数据存储使用 Reflect 存储计算属性元数据src/core/Decorators.ts:77-84

状态管理

ViewModels 通过验证、脏状态跟踪和生命周期管理功能提供全面的状态管理。

验证系统

验证系统与可观察属性集成,提供实时验证反馈:

功能描述实现方式
属性验证使用 @validate 装饰器的单个属性验证src/core/ViewModel.ts:358-381
批量验证使用 validateAll() 验证所有属性src/core/ViewModel.ts:385-403
错误存储验证错误存储在 _validationErrors Map 中src/core/ViewModel.ts:74
验证状态isValid、hasValidationErrors、isValidating 属性src/core/ViewModel.ts:422-438
集成在属性变更时自动运行验证src/core/ViewModel.ts:478-490

脏状态跟踪

脏状态跟踪监控 ViewModel 自初始化或上次清洁状态以来是否已被修改:

方法用途行为
markAsDirty()标记 ViewModel 为已修改设置 _isDirty = true,通知观察者
markAsClean()标记 ViewModel 为未修改设置 _isDirty = false,通知观察者
isDirty getter检查 ViewModel 是否有变更返回当前脏状态
自动跟踪自动脏状态标记在 setProperty() 调用时触发

ViewModel 生命周期

ViewModels 遵循从创建到销毁的结构化生命周期,具有初始化和清理的钩子。

生命周期方法

阶段方法用途
创建constructor(), onInitialize()初始化 ViewModel 状态并调用子类设置
装饰器设置DecoratorUtils.initializeDecorators()将装饰器功能应用到实例
活跃使用属性访问、命令执行带有响应式更新的正常操作
清理destroy()清除命令、验证错误、观察者

与装饰器的集成

ViewModel 系统与装饰器系统密切协作,提供声明式的属性和方法增强。

装饰器集成流程

@viewModel 装饰器作为入口点,确保所有其他装饰器都正确初始化:

typescript
// 测试文件中的用法示例
@viewModel
class TestViewModel extends ViewModel {
    @observable
    public firstName: string = '';
    
    @computed(['firstName', 'lastName'])
    public get fullName(): string {
        return `${this.firstName} ${this.lastName}`.trim();
    }
    
    @command()
    public simpleCommand(): void {
        this.age = 25;
    }
}

类型安全特性

ViewModel 系统为命令执行和属性访问提供了广泛的 TypeScript 类型安全。

类型安全的命令执行

类型系统通过以下方式确保命令执行的编译时安全:

类型特性用途实现方式
方法过滤只允许实际的命令方法FilteredCommandMethods<T> 类型
参数提取推断正确的参数类型CommandParameters<T, K> 类型
返回类型安全保持方法返回类型CommandReturnType<T, K> 类型
重载方法支持参数化和非参数化命令多个 executeCommand 签名

基于 MIT 许可证发布