405 lines
7.9 KiB
JavaScript
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;
|