原来是全局碰撞惹的祸

This commit is contained in:
2024-07-31 10:48:42 +08:00
parent df8b52264e
commit 9aa9806b62
38 changed files with 1640 additions and 313 deletions

107
doc/mvvm/ViewModelScript.md Normal file
View File

@@ -0,0 +1,107 @@
## View Model Script
### 介绍
View Model 的脚本用法
### 方法
VM是 VMManager 的实例, 用于管理所有的 ViewModel 实例。ViewModel实例 主要用于实现数据的双向绑定,内部使用了 cc.director.emit 方法 来发送数据变动的消息,在使用时你可以不用关注于这些细节。
我们可以通过 import VMVMManager 对象 来管理 所有的 ViewModel **不建议**直接去使用 ViewModel 实例。
```typescript
//TS 使用 import 引入
import { VM } from './ViewModel';
//JS 可以使用 require 的方式引入,其他用法没有区别
const { VM } = require('./ViewModel');
```
- `add` - 创建并且添加一个 ViewModel 对象
``` typescript
VM.add(data,tag);
//data - 你想要进行 绑定 的数据对象
//tag - 该数据对象的索引标签,用于之后获取该 ViewModel 对象
```
- `get` - 获取
```typescript
let vm = VM.get(tag);//获取的结果是一个 ViewModel 对象
let data = vm.$data; //获取 vm 绑定的 data 对象
vm.active = false; // 关闭 vm 的数据通知功能
```
- `remove` - 移除
```typescript
VM.remove(tag);//移除一个指定 tag 的 ViewModel 对象
```
- `setValue` - 设置一个值以tag开头的全局路径
```typescript
VM.setValue('global.player.name','wss');
//注意 global 是 ViewModel 的标签player.name 是 ViewModel 内部的取值路径
//使用 VM 全局管理,必须按这种全局路径的方式设置值
```
- `addValue` - 累加一个值以tag开头的全局路径
```typescript
VM.addValue('global.player.hp',10);
```
- `getValue` - 获取一个值以tag开头的全局路径
```typescript
VM.getValue('global.player.name',default);//default 是 默认值
```
- `setObjValue` - 以路径的形式 设置 一个 对象的值
- `getObjValue` - 以路径的形式 获取 一个 对象的值
- `bindPath` - 绑定需要监听的路径
- `unbindPath` - 取消绑定需要监听的路径
- `active` - 激活 数值变动的事件通知
- `inactive` - 关闭 数值变动的事件通知
### 例子
```typescript
import { VM } from './ViewModel';
//构建数据对象
let data = {
name:'user',
gold:12200,
info:{
id:0
}
}
//创建 VM 对象,并且添加到 VMManager 来进行管理, 标记为 'user' 标签
VM.add(data,'user');
//通过 'user' 标签获取一个 ViewModel 的实例
let vm = VM.get('user');
vm.$data; // vm.$data === data;
//设置新的属性值
vm.setValue('name','new Name');
//获取属性
vm.getValue('gold');
//通过相对路径获取属性
vm.getValue('info.id');
//一旦修改值,将会通知 cc.director, 使用emit 发送消息
data.name = 'my_name';
//关闭激活状态后,就不会通知 cc.director 传递信息了
vm.active = false;
//移除ViewModel并且释放 data 的引用
VM.remove('user');
data = null
```