更新mvvm示例

This commit is contained in:
YHH
2025-07-08 08:55:55 +08:00
parent d2b4455205
commit 7b85039b17
15 changed files with 2599 additions and 21 deletions

View File

@@ -0,0 +1,87 @@
import { _decorator, Component, Label, Button } from 'cc';
import { DataBinding, BindingType, BindingMode } from '@esengine/mvvm-ui-framework';
import { TestViewModel } from './TestViewModel';
const { ccclass, property } = _decorator;
@ccclass('TestView')
export class TestView extends Component {
@property(Label)
testLabel: Label = null!;
@property(Button)
testButton: Button = null!;
private viewModel: TestViewModel;
private dataBinding: DataBinding;
private bindingId: string = '';
onLoad() {
console.log('TestView onLoad');
// 初始化数据绑定系统
this.dataBinding = DataBinding.getInstance();
// 创建 ViewModel
this.viewModel = new TestViewModel();
console.log('创建 ViewModel:', this.viewModel);
// 手动添加观察者来测试
this.viewModel.addObserver('testValue', (newValue, oldValue, property) => {
console.log(`属性 ${property} 变化: ${oldValue} -> ${newValue}`);
if (this.testLabel) {
this.testLabel.string = '测试值: ' + newValue;
console.log('手动更新 Label 文本:', this.testLabel.string);
}
});
// 设置数据绑定
this.setupDataBinding();
// 设置按钮事件
this.setupButtonEvent();
// 测试初始值
console.log('初始值:', this.viewModel.testValue);
}
private setupDataBinding(): void {
if (this.testLabel) {
console.log('设置数据绑定');
console.log('Label 对象:', this.testLabel);
console.log('Label 初始文本:', this.testLabel.string);
this.bindingId = this.dataBinding.bind(this.viewModel, this.testLabel, {
type: BindingType.ONE_WAY,
mode: BindingMode.FORMAT,
source: 'testValue',
target: 'string',
format: '测试值: {0}'
});
console.log('绑定ID:', this.bindingId);
// 手动测试一下绑定是否工作
this.testLabel.string = '测试值: ' + this.viewModel.testValue;
console.log('手动设置后的文本:', this.testLabel.string);
}
}
private setupButtonEvent(): void {
if (this.testButton) {
this.testButton.node.on(Button.EventType.CLICK, () => {
console.log('按钮点击');
this.viewModel.addValue();
});
}
}
onDestroy() {
if (this.bindingId) {
this.dataBinding.unbind(this.bindingId);
}
if (this.viewModel) {
this.viewModel.destroy();
}
}
}