Files
2019-05-30 16:58:35 +08:00

141 lines
3.9 KiB
TypeScript

import { VM } from './ViewModel';
//用来处理通知数据的层级
//控制旗下子节点的数据
//目前只是起到一个识别组件的作用,之后会抽象很多功能在这里面
// player.equips.* 可以自动根据所在父对象的位置设置顺序
const DEBUG_WATCH_PATH:boolean = false;
const {ccclass, property} = cc._decorator;
/**
* watchPath 的基础,只提供绑定功能 和 对应的数据更新函数
*/
@ccclass
export default class VMBase extends cc.Component {
/** watch 单路径 */
public watchPath:string = '';
/** watch 多路径 */
protected watchPathArr:string[] = [];
/**是否启用模板多路径模式 */
public templateMode:boolean = false;
/**储存模板多路径的值 */
protected templateValueArr:any[] = [];
/**VM管理 */
public VM = VM;
/**
* 如果需要重写onLoad 方法,请根据顺序调用 super.onLoad(),执行默认方法
*/
onLoad(){
if(CC_EDITOR)return;
//提前拆分、并且解析路径
let paths = this.watchPath.split('.');
for (let i = 1; i < paths.length; i++) {
const p = paths[i];
//如果发现了路径使用了 * ,则自动去自己的父节点查找自己所在 index 值
if(p == '*'){
let index = this.node.getParent().children.findIndex(n=> n === this.node);
if(index<=0)index = 0;
paths[i] = index.toString();
break;
}
}
//替换掉原路径
this.watchPath = paths.join('.');
//提前进行路径数组 的 解析
let pathArr = this.watchPathArr;
if(pathArr.length >=1){
for (let i = 0; i < pathArr.length; i++) {
const path = pathArr[i];
let paths = path.split('.');
for (let i = 1; i < paths.length; i++) {
const p = paths[i];
if(p == '*'){
let index = this.node.getParent().children.findIndex(n=> n === this.node);
if(index<=0)index = 0;
paths[i] = index.toString();
break;
}
}
this.watchPathArr[i] = paths.join('.');
}
}
//打印出所有绑定的路径,方便调试信息
if(DEBUG_WATCH_PATH && CC_DEBUG){
cc.log('所有路径',this.watchPath?[this.watchPath]:this.watchPathArr,'<<',this.node.getParent().name +'.'+ this.node.name)
}
if(this.watchPath == '' && this.watchPathArr.join('')==''){
cc.log('可能未设置路径的节点:',this.node.getParent().name +'.'+ this.node.name);
}
}
onEnable(){
if (CC_EDITOR) return;//编辑器模式不能判断
if(this.templateMode){
this.setMultPathEvent(true);
}else if(this.watchPath != ''){
this.VM.bindPath(this.watchPath,this.onValueChanged,this);
}
this.onValueInit();//激活时,调用值初始化
}
onDisable(){
if (CC_EDITOR) return;//编辑器模式不能判断
if(this.templateMode){
this.setMultPathEvent(false);
}else if(this.watchPath != ''){
this.VM.unbindPath(this.watchPath,this.onValueChanged,this);
}
}
//多路径监听方式
private setMultPathEvent(enabled:boolean = true){
if(CC_EDITOR)return;
let arr = this.watchPathArr;
for (let i = 0; i < arr.length; i++) {
const path = arr[i];
if(enabled){
this.VM.bindPath(path,this.onValueChanged,this);
}else{
this.VM.unbindPath(path,this.onValueChanged,this);
}
}
}
protected onValueInit(){
//虚方法
}
protected onValueChanged(n,o,pathArr:string[]){
}
}