当前位置: 首页 > 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://www.jmfq.cn/news/5355721.html

相关文章:

  • 西宁网站建设多少钱/可以直接进入的舆情网站
  • 江山集团网站建设/个人网站免费域名和服务器
  • 推荐定制型网站建设/防止恶意点击软件管用吗
  • 静态网站建设背景/少儿编程
  • 广州网站优化建设/网页游戏推广平台
  • 母婴网站建设初衷/什么是seo
  • 云南照明网站建设/免费独立站自建站网站
  • 安徽网站建设外贸/新站整站快速排名
  • 淘宝建设网站首页/互动营销经典案例
  • mac os网站建设/国内新闻大事20条简短
  • 永泰县建设局网站/百度竞价开户费用
  • 中国建设银行新闻网站/宁波seo关键词
  • 建设农产品网络营销网站/搜索引擎查重
  • 玩具网站建设方案/网站推广优化
  • 选择网站建设公司应该注意什么/seo哪家公司好
  • 网站的建设背景/百度客户管理系统登录
  • 学院宣传网站建设简介/色盲眼镜
  • 企业内网 网站建设的解决方案/seo快速优化报价
  • 营销型网站建设排名/武汉seo首页优化技巧
  • 南昌网站建设优化/顾问式营销
  • 西安网站建设动力无限/友情链接是免费的吗
  • 网站建设及数据分析/设计网站用什么软件
  • 会议网站建设方案/百度明星人气榜排名
  • 营销网站建设培训学校/企业网站怎么推广
  • 四川城乡建设部网站首页/搜索推广渠道
  • 北京市建设局网站首页/外贸平台排名
  • 无锡赛孚建设工程有限公司网站/舆情监测系统排名
  • 鲜花店网站建设的规模设想/天津seo排名公司
  • 网站建设 数据上传 查询/网络服务商在哪咨询
  • 网站了建设/小米的推广软文