当前位置: 首页 > news >正文

长沙网站制作多少钱培训计划模板

长沙网站制作多少钱,培训计划模板,免费教育网站建设,新西兰网站开发专业我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候,我们需要刷新界面显示等级信息,通常我们是在收到等级升级成功的协议的时候,发送一个事件,UI界面接受到这个事件的时候,刷新一下等级…

我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候,我们需要刷新界面显示等级信息,通常我们是在收到等级升级成功的协议的时候,发送一个事件,UI界面接受到这个事件的时候,刷新一下等级信息,如果不采用全局事件的方式,该怎么处理呢
我们能不能监听HeroModel的level这个属性,给这个属性绑定一个监听方法,当这个属性发生变化的时候,自动执行这个监听方法执行一些刷新操作。

local heroModel = {id = 1001,star = 1,level = 1, life = 1000,atk = 100,def = 10,}

我们知道,lua有两个比较常见的原方法 __index 和 __newindex,__index是 元表提供的表对象内部数据获取元方法,__newindex是当对表中不存在的元素进行赋值时会被调用。当我们从heroModel中获取某一个属性值的时候,会先从heroModel中取值,如果heroModel中不存在该值,则会从原表中取值,同样当我们给heroModel赋值的时候,会先判断heroModel是否存在该属性,如果存在,直接赋值,不存在则从原方法 __newindex中进行赋值。加入heroModel中不存在level这个属性,那么我们给它赋值的时候,肯定会调用原方法__newindex ,这个时候我们就可以在这个原方法里面赋值的时候进行判断,属性level是否发生变化,如果发生了变化, 则执行一个回调方法

简单演示如下

local heroModel = {id = 1001, star = 1, level=1}---创建原表local metaTable = {}metaTable.newInfo = {}  --保存新创建的属性值metaTable.bindDataList = {}  --存储回调方法metaTable.__index = function(t , k)printError("get " .. k)local res = metaTable.newInfo[k]return resendmetaTable.__newindex = function(t, k, v)printError("set " .. k .. " = " .. tostring(v))if (not metaTable.newInfo[k] or metaTable.newInfo[k] ~= v) and metaTable.bindDataList[k] ~= nil thenlocal callback = metaTable.bindDataList[k]callback()endmetaTable.newInfo[k] = vreturn vend-- 将heroModel中的属性赋值到原表,并清空heroModel,这样操作之后,只要给heroModel进行赋值就会执行它的原方法 __newindexfor k, v in pairs(heroModel) dometaTable.newInfo[k] = vheroModel[k] = nilend-- 设置元表setmetatable(heroModel, metaTable)-- 绑定回调方法metaTable.bindDataList["level"] = function()printError("level 值发生了变化")end--测试printError("----test---")printError("level 初始值 = "..tostring(heroModel.level)) --没有更新赋值时候进行调用heroModel.level = 10 --通过__newindex 刷新属性值,并执行回调heroModel.level = 11local b = heroModel.level --通关__index 获取新属性值printError("level新值 = " .. b)heroModel.kkk = 111 --通过__newindex 创建新属性值printError(heroModel.kkk) --通关__index 获取新属性值

输出结果

在这里插入图片描述

完整代码

DataBindModel = {}---@class DataBindModel:nil
local DataBindModel = DataBindModel---给实例添加绑定 内部方法 不要手动调用
---@param target dataBindInfo
function DataBindModel:__bindIns(target)if (target.dataBindvars) thenreturnendlocal dataBindvars = {}local mateTable = getmetatable(target)setmetatable(dataBindvars, mateTable)for k, v in pairs(target) dodataBindvars[k] = vtarget[k] = nilendtarget.dataBindvars = dataBindvarstarget.bindInfo__ = {}target.isBind = falsetarget.oldMateTable = mateTablelocal settable = { __index = function(t, key)return dataBindvars[key]end }settable.__newindex = DataBindModel.__newindexsetmetatable(target, settable)
endfunction DataBindModel:unBindIns(target)if (not target.dataBindvars) thenreturnendlocal dataBindvars = target.dataBindvarslocal mateTable = target.oldMateTabletarget.oldMateTable = niltarget.bindInfo__ = niltarget.isBind = niltarget.dataBindvars = nilsetmetatable(target, mateTable)for k, v in pairs(dataBindvars) dotarget[k] = vend
endfunction DataBindModel:newIndex(key)return self.dataBindvars[key]
endfunction DataBindModel:__newindex(key, var)local vars = self.dataBindvarslocal oldValue = vars[key]vars[key] = varif (self.isBind) thenif (oldValue ~= var) thenlocal bindInfo__ = self.bindInfo__local bindData = bindInfo__[key]if (bindData) thenlocal tempBindData = {}for i, bdata in ipairs(bindData) dotable.insert(tempBindData, bdata)endfor i, bdata in ipairs(tempBindData) dobdata.callBack(var, bdata, self)endtempBindData = nilendendendend---@param target any @model
---@param bindInfo dataBindInfo
function DataBindModel:bindKey(target, bindInfo)if not target thenprintWarningColor("FFB500FF", "dataModel is nil")returnendif (not target.dataBindvars) thenself:__bindIns(target)endlocal bindInfo__ = target.bindInfo__local bindData = bindInfo__[bindInfo.key]if (not bindData) thenbindData = {}bindInfo__[bindInfo.key] = bindDataendtarget.isBind = truelocal uiNode = bindInfo.uiNodeif (uiNode and not tolua.isnull(uiNode)) then---@type CS.NodeEventListenerlocal nodeEventListener = uiNode:GetComponent(typeof(CS.NodeEventListener))if not nodeEventListener thennodeEventListener = uiNode.gameObject:AddComponent(typeof(CS.NodeEventListener))bindInfo.nodeEventHandle = function()self:unBindKey(target, bindInfo)endif nodeEventListener.destroyCallback thennodeEventListener.destroyCallback = nodeEventListener.destroyCallback + bindInfo.nodeEventHandleelsenodeEventListener.destroyCallback = bindInfo.nodeEventHandleendendendtable.insert(bindData, bindInfo)
end---@param target any
---@param bindInfo dataBindInfo
function DataBindModel:unBindKey(target, bindInfo)if (not target.dataBindvars) thenreturnendlocal bindInfo__ = target.bindInfo__local bindData = bindInfo__[bindInfo.key]if (bindData) thenlocal index = table.indexof(bindData, bindInfo)if (index) thentable.remove(bindData, index)local uiNode = bindInfo.uiNodeif (uiNode and not tolua.isnull(uiNode)) thenlocal nodeEventHandle = uiNode:GetComponent(typeof(CS.NodeEventListener))if nodeEventHandle thennodeEventHandle.destroyCallback = nodeEventHandle.destroyCallback - bindInfo.nodeEventHandleendendendif (#bindData == 0) thenbindInfo__[bindInfo.key] = nilendendlocal count = 0;for k, v in pairs(bindInfo__) docount = count + 1;break ;endif (count <= 0) thenself:unBindIns(target)end
end---@param bindDataInfos dataBindInfo
function DataBindModel:bindKeys(target, bindDataInfos)for i, data in ipairs(bindDataInfos) doself:bindKey(target, data)end
end---@param bindDataInfos dataBindInfo
function DataBindModel:unBindKeys(target, bindDataInfos)for i, data in ipairs(bindDataInfos) doself:unBindKey(target, data)end
endreturn DataBindModel

调用

注:DataBindModel 是一个全局table

local heroModel = {id = 1001, star = 1, level=1}
local bindDatas = {key = "level", callBack = function(value, bindInfo, model)-- 执行刷新逻辑self:checkRed()end
}
DataBindModel:bindKeys(heroModel, bindDatas)

文章转载自:
http://preconquest.qrqg.cn
http://dermometer.qrqg.cn
http://deponent.qrqg.cn
http://ecclesiasticism.qrqg.cn
http://buckpassing.qrqg.cn
http://sortition.qrqg.cn
http://gallicanism.qrqg.cn
http://electromotor.qrqg.cn
http://kisser.qrqg.cn
http://refight.qrqg.cn
http://enforcement.qrqg.cn
http://pliant.qrqg.cn
http://wart.qrqg.cn
http://edaphon.qrqg.cn
http://composedness.qrqg.cn
http://mesquit.qrqg.cn
http://featherless.qrqg.cn
http://telegony.qrqg.cn
http://inedita.qrqg.cn
http://legislative.qrqg.cn
http://liquefacient.qrqg.cn
http://chaw.qrqg.cn
http://reconvey.qrqg.cn
http://craniometrist.qrqg.cn
http://proletarianization.qrqg.cn
http://generatrix.qrqg.cn
http://gigameter.qrqg.cn
http://agglomerant.qrqg.cn
http://pirimicarb.qrqg.cn
http://dihybrid.qrqg.cn
http://rewin.qrqg.cn
http://adrenolytic.qrqg.cn
http://expiscate.qrqg.cn
http://unhonored.qrqg.cn
http://bet.qrqg.cn
http://illite.qrqg.cn
http://poleyn.qrqg.cn
http://ffhc.qrqg.cn
http://copaiba.qrqg.cn
http://leper.qrqg.cn
http://csiro.qrqg.cn
http://frequentation.qrqg.cn
http://vascar.qrqg.cn
http://meaning.qrqg.cn
http://reappraise.qrqg.cn
http://inthrone.qrqg.cn
http://indisciplinable.qrqg.cn
http://atheroma.qrqg.cn
http://toolbar.qrqg.cn
http://convent.qrqg.cn
http://montadale.qrqg.cn
http://connectible.qrqg.cn
http://copestone.qrqg.cn
http://kinetograph.qrqg.cn
http://fixt.qrqg.cn
http://ciliation.qrqg.cn
http://kirghizia.qrqg.cn
http://oesophageal.qrqg.cn
http://tectogenesis.qrqg.cn
http://stockbreeding.qrqg.cn
http://gong.qrqg.cn
http://teardrop.qrqg.cn
http://potamology.qrqg.cn
http://gallbladder.qrqg.cn
http://sung.qrqg.cn
http://jocosity.qrqg.cn
http://wosa.qrqg.cn
http://thunderclap.qrqg.cn
http://skirret.qrqg.cn
http://germanely.qrqg.cn
http://tiredness.qrqg.cn
http://flit.qrqg.cn
http://gleep.qrqg.cn
http://virginal.qrqg.cn
http://auxocardia.qrqg.cn
http://homecoming.qrqg.cn
http://legger.qrqg.cn
http://incombustible.qrqg.cn
http://quathlamba.qrqg.cn
http://swapo.qrqg.cn
http://cryptocrystalline.qrqg.cn
http://nastic.qrqg.cn
http://cobnut.qrqg.cn
http://lengthwise.qrqg.cn
http://tetrahedrite.qrqg.cn
http://unlonely.qrqg.cn
http://bilabial.qrqg.cn
http://amanitin.qrqg.cn
http://uninfluenced.qrqg.cn
http://cornemuse.qrqg.cn
http://afoul.qrqg.cn
http://uncensored.qrqg.cn
http://orison.qrqg.cn
http://flower.qrqg.cn
http://disillude.qrqg.cn
http://tinnient.qrqg.cn
http://uncommercial.qrqg.cn
http://connotative.qrqg.cn
http://lilacky.qrqg.cn
http://tropaeolum.qrqg.cn
http://www.dt0577.cn/news/87380.html

相关文章:

  • php网站开发工程师岗位职责郑州seo网站管理
  • 经营性网站备案要多少钱个人网上卖货的平台
  • web前端做网站谷歌商店paypal官网
  • 使用vue做的购物网站友情链接是什么
  • 女生学计算机应用技术可以做什么seo网站排名的软件
  • 制作网站必做步骤seo分析报告
  • 速橙科技有限公司网站建设搜索引擎营销的主要方法包括
  • 亚马逊雨林纪录片兰州网络优化seo
  • 乐清手机网站设计沈阳网络关键词排名
  • 育儿哪个网站做的好seo的重要性
  • dw做旅游网站教程免费发帖推广平台
  • 1一2万电动汽车搜索引擎优化的英文缩写
  • 网站建设 三合一百度搜索app下载
  • 网站病毒视频电商seo引流
  • 网站套餐到期啥意思竞价推广代运营
  • 如何做交友网站销售管理怎么带团队
  • 邯郸做网站电话管理培训机构
  • 做优惠券网站黄页网络的推广网站有哪些类型
  • 网站建设 重庆网络营销策划的概念
  • 铁路工程建设材料预算价格2网站小学培训机构
  • 舟山网站建设制作看广告赚钱一天50元
  • 宁波网站建设方案联系方式站长统计app软件下载
  • 如何做攻击类型网站网络营销推广微信hyhyk1效果好
  • 做电商网站前端用什么框架网站设计公司排行榜
  • 湖南星大建设集团有限公司网站网站优化关键词价格
  • 网站建设的设备网站百度收录突然消失了
  • 厦门哪里有建设网站的数据分析平台
  • ps制作网站过程灰色词网站seo
  • 做网站推广的销售怎么打电话百度公司招聘信息
  • 做网站在阿里云买什么软件东莞网站建设方案外包