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

通过ViewModel来解耦MVC

一、MVC加Event的混沌

 在MVC中,我们当前有窗口:

WndA,WndB,WndC。
我们有事件:
BData_ChangeEvent(bool isOpen):B相关数据变更事件,isOpen为true时,打开WndB
CData_ChangeEvent(bool isOpen):C相关数据变更事件,isOpen为true时,打开WndC

我们有数据请求:
BDataReq:请求数据B,Res回调后发送BData_ChangeEvent
BDataReq:请求数据C,Res回调后发送CData_ChangeEvent

现在的需求是:我们打开WndA的时候,需要请求B和C数据,判断是否要开启WndB,WndC。
当监听到BData_Change为true时,打开WndB。
当监听到CData_Change为true时,打开WndC。
如果WndB和WndC都要开,WndC要等WndB关闭后再开。

做法:
WndA
监听
BData_ChangeEvent(bool isOpen)
CData_ChangeEvent(bool isOpen)

打开Wnd发送BDataReq请求
-->BData_ChangeEvent(bool isOpen)
-->isOpen为true-->打开WndB-->WndB关闭的时候,发送CDataReq请求
-->isOPen为false-->发送CDataReq请求,CData_ChangeEvent(bool isOpen)-->isOPen为true时,打开WndC

现在这个流程
WndA在请求BDataReq,CDataReq
WndB在请求CDataReq,看上去没啥问题,但是这种调用链很容易让代码变得很难阅读,也很难修改。
回调地狱,状态分散在各个事件监听器中。
事件虽然本身不会直接导致回调地狱,但事件驱动的异步编程模式很容易演变成回调地狱。

二、引入ViewModel

事件虽然本身不会直接导致回调地狱,但事件驱动的异步编程模式很容易演变成回调地狱。
于是让页面尽量不去依赖事件系统,引入VieModel层,页面更新通过ViewModel层去通知。
为WndA,WndB,WndC添加一个VieModel,把ViewModel取名为Holder,意为页面持有者。

流程变成了这样:打开WndA,创建ViewModel:AHolder。
AHolder-->
定义变量:
int m_getResCount; // 表示收到的消息数量,
List<Wnd> m_needShowWndList; // 表示要展示的页面列表,在展示前对其进行排序
同时请求BDataReq,CDataReq-->等待m_getResCount == 2;
当m_getResCount 满足条件后-->m_needShowWndList依次展示页面。

 

三、ViewModel解决的问题
引入ViewModel,把多个View的逻辑可以放到一起,减少回调地狱。
解耦ViewController,ViewModel可以为View构建表现数据。
一个ViewModel可以对应多个需要同类数据,表现不同的页面。

 

 

http://www.jsqmd.com/news/727123/

相关文章:

  • 镜像视界的技术与其他空间计算企业有什么不同?
  • ONLYOFFICE 7.5新版本实测:PDF编辑+AI插件,能替代你的本地办公套件了吗?
  • AI教材写作新突破,低查重AI工具一键生成40万字教材书稿!
  • 3个策略:如何用Jd-Auto-Shopping实现90%抢购成功率
  • 镜像视界纯视频原生空间计算 核心七大硬核优势
  • 4月30日成都地区成实产螺旋焊管(Q235B;内径DN200-3500mm)批发价格 - 四川盛世钢联营销中心
  • 工程应用:网格验证如何决定散热系统成败?
  • llm-auto-context:为AI编程助手自动生成项目代码快照,提升开发效率
  • 3大架构创新:UiCard框架如何重构Unity卡牌游戏UI开发范式
  • 如何在5分钟内搭建家庭游戏串流服务器:Sunshine终极指南
  • APA 7th格式终极解决方案:3个技巧解决Word引用难题
  • 从GroundingDino推理到Open-GroundingDino训练:我的环境配置与验证集精度为0的踩坑实录
  • 国内数字孪生技术哪家强?答案:镜像视界
  • css收集
  • ElementUI表格套娃实战:el-table内嵌el-table处理复杂日程预约表单(附完整代码)
  • 在Node.js后端服务中集成Taotoken实现稳定的大模型调用
  • PandaTV直播录制难题全面解析:从网络隔离到稳定录制的完整技术方案
  • 远程控制服务器开关机——Wake-on-LAN(WOL 局域网唤醒)
  • AI教材生成新突破!低查重AI写教材工具,快速产出20万字优质教材!
  • 从ERP到S/4HANA:业务伙伴(BP)BAPI调用有哪些变化?CL_MD_BP_MAINTAIN使用指南
  • Mac Mouse Fix:将普通鼠标转变为macOS生产力利器
  • 4月30日成都地区磐金产无缝钢管(8163-20#;外径42-530mm)批发价格 - 四川盛世钢联营销中心
  • WeDLM-7B-Base实战案例:用WeDLM替代GPT-4做低成本长文本补全方案
  • AI教材写作实用攻略:借助低查重工具,轻松生成优质教材!
  • Nodejs后端服务如何安全高效地接入Taotoken管理大模型调用
  • 终极指南:Dio拦截器实现HTTP请求头全自动管理,告别重复编码
  • 保姆级教程:在Ubuntu 22.04上搞定JSBSim与AirSim的飞行仿真联调(附VSCode排错实录)
  • 创业团队如何利用Taotoken统一管理多个AI模型的API调用与成本
  • Houdini SOP模块实战:从Font节点到PolyExtrude,手把手教你做3D卡通字效
  • 数字孪生和视频孪生有什么区别?哪家更领先?镜像视界