Files
2026-05-23 22:10:14 +08:00

405 lines
7.9 KiB
JavaScript

/*******************************************************************************
*
* Nx视图管理器
*
*
*
* 2021.12.10
******************************************************************************/
const NxObject = require( "nx.object" );
var nxViewManager = cc.Class( {
extends: NxObject,
name: "nxViewManager",
// 初始化
initialize: function( _args ) {
// USPER
if( !this._super( _args ) ) {
return false;
}
this.models = {}; // 模型注册表
this.dicViews = {}; // 全视图字典
this.vRefCounter = 1000; // 多实例视图计数器
this.bindTargets = {}; // VBD表
// 全局服务开启
nx.views = this;
return true;
},
// 销毁
uninitialize: function() {
nx.logger.debug( "destroy all views: " );
for( let vid in this.dicViews ) {
this.delView( vid );
}
// 全局服务关闭
nx.views = null;
// VBD清理
this.cleanBindTargets();
// USPER
return this._super();
},
// 模型注册
regModel: function( _key, _model, _single ) {
var mod = this.queryModel( _key, false );
if( mod ) {
nx.error( "[视图]重复注册失败:%s!", _key );
return false;
}
// 注册
this.models[_key] = {
name : _key,
model : nx.dt.objClone( _model ),
single : _single ? true : false
};
nx.debug( "[视图]注册成功:%s!", _key );
return true;
},
// 模型注销
unregModel: function( _key ) {
var mod = this.models[_key];
if( !mod ) {
nx.error( "[视图]注销失败,不存在注册信息:%s!", _key );
return false;
}
delete this.models[_key];
nx.debug( "[视图]注销成功:%s!", _key );
return true;
},
// 查询
queryModel: function( _key, _warn = true ) {
var mod = this.models[_key];
if( mod ) {
return mod;
}
if( _warn ) {
nx.warn( "[视图]查询模型失败:%s!", _key );
}
return null;
},
// 获取合并模板结果
combineModel: function( _modName, _modEx ) {
// 是否有效
var model = this.queryModel( _modName );
if( !model ) {
return nx.dt.objClone( _modEx );
}
// 追加
var ret = nx.dt.objClone( model );
if( nx.dt.arrGood( _modEx ) ) {
ret = ret.concat( _modEx );
}
return ret;
},
// 获取视图
queryView: function( _vid, _warn ) {
var v = this.dicViews[ _vid ];
if( !v && _warn != false ) {
nx.warn( "[视图]找到视图失败,无效的视图编号:", _vid );
}
return v;
},
// 创建视图
buildView: function( _modName, _vmodel ) {
// 如果_vmodel为空,则直接用_modName注册的模型进行实例化
// 否则用_vmodel作为模型直接创建
var model = _vmodel ? { model: nx.dt.objClone( _vmodel ) } : this.queryModel( _modName );
if( !model || !model.model ) {
nx.warn( "[视图]模型不合法,创建失败:%s!", _modName );
return -1;
}
// 创建新视图
var v = nx.factory.create( "nx.view" );
if( !v ) {
return -1;
}
// 视图编号: 单例视图直接使用modName即可
if( this.isSingleView( _modName ) ) {
v.vid = _modName;
}
else {
v.vid = "V" + ++this.vRefCounter;
}
this.dicViews[ v.vid ] = v;
v.reset( model.model );
// nx.debug( "[视图]创建成功:", _modName, v.vid );
return v.vid;
},
// 视图重置
resetView: function( _vid, _vmodel, _clean ) {
var v = this.queryView( _vid );
if( v ) {
if( _clean ) {
v.vclear();
}
return v.reset( _vmodel );
}
nx.error( "[视图]重置视图失败,不存在!", _vid );
return false;
},
// 视图删除
delView: function( _vid ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.warn( "[视图]删除失败,不存在:", _vid );
return false;
}
nx.factory.remove( v );
delete this.dicViews[ _vid ];
nx.debug( "[视图]删除成功:", _vid );
return true;
},
// 监听绑定
bindView: function( _vid, _bindername, _lst ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.error( "[视图]监听失败,不存在:", _vid );
return false;
}
return v.vbinds( _bindername, _lst );
},
// 监听解除
unbindView: function( _vid, _bindername ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.warn( "[视图]监听解除失败,不存在:", _vid );
return false;
}
return v.vunbind( _bindername );
},
// 直接获取视图数据
getData: function( _vid, _vk, _def ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.warn( "[视图]获取属性失败,不存在:", _vid );
return false;
}
return v.vget( _vk, _def );
},
// 直接获取视图数据
getOldData: function( _vid, _vk, _def ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.warn( "[视图]获取属性失败,不存在:", _vid );
return false;
}
return v.vgetOld( _vk, _def );
},
// 直接设置视图数据
setData: function( _vid, _vk, _value, _notify ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.warn( "[视图]设置属性失败,不存在:", _vid );
return false;
}
// console.log( "[视图]设置: %s %s", _vid, _vk );
return v.vset( _vk, _value, _notify );
},
// 直接批量设置视图数据
setDataBatch: function( _vid, _vpairs ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.warn( "[视图]批量设置失败,不存在:", _vid );
return false;
}
for( let k in _vpairs ) {
var p = _vpairs[ k ];
v.vset( p[ 0 ], p[ 1 ], p[ 2 ] );
}
return true;
},
// 是不是唯一视图
isSingleView: function( _modName ) {
var mod = this.queryModel( _modName );
if( mod && mod.single ) {
return true;
}
return false;
},
// 视图对象化
toObject: function( _vid ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.warn( "[视图]对象化失败,不存在:", _vid );
return null;
}
let ret = {};
for( let key in v.props ) {
ret[key] = v.props[key].now;
}
return ret;
},
// 视图对象化更新
fromObject: function( _vid, _obj ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.warn( "[视图]对象化更新失败,不存在:", _vid );
return null;
}
let ret = {};
for( let key in _obj ) {
v.vset( key, _obj[key] );
}
return ret;
},
// 打印视图
dumpView: function( _vid, _tform ) {
var v = this.queryView( _vid, false );
if( !v ) {
nx.warn( "[视图]打印失败,不存在:", _vid );
return false;
}
if( _tform != false ) {
if( console && console.table ) {
console.table( v.props, [ "now", "old", "desc" ] );
return true;
}
}
if( console && console.log ) {
console.log( v.props );
return true;
}
nx.warn( "[视图]打印失败,没有控制台!" );
return false;
},
// ------------------------------------------------------------------------
// (自定义)VBD视图可绑定对象相关支持
// ------------------------------------------------------------------------
// 注册
regBindTarget: function( _key, _target ) {
let target = this.bindTargets[_key];
if( target ) {
nx.error( "[视图]注册自定义视图对象重复:%s!", _key );
return;
}
this.bindTargets[_key] = _target;
nx.debug( "[视图]注册自定义视图对象:%s", _key );
},
// 注销
unregBindTarget: function( _key ) {
let target = this.bindTargets[_key];
if( target ) {
delete this.bindTargets[_key];
nx.debug( "[视图]注销自定义视图对象:%s", _key );
}
},
// 查找
queryBindTarget: function( _key ) {
let target = this.bindTargets[_key];
if( !target ) {
nx.error( "[视图]自定义视图对象查询失败:%s!", _key );
}
return target;
},
// 清理
cleanBindTargets: function() {
this.bindTargets = {};
nx.debug( "[视图]注册自定义视图对象全清理!" );
},
} );
// 模块导出
module.exports = nxViewManager;