当前位置: 首页 > Web前端 > vue.js

SAPUI5和Vue双向数据绑定实现原理对比

时间:2023-03-31 19:17:50 vue.js

UI5中的双向数据绑定双向数据绑定测试:控件属性变化导致模型字段变化双向数据绑定测试:模型字段变化导致控件属性变化双向数据绑定在Vue中双向数据绑定测试:模型字段变化导致控件属性changeTwowaydatabindingtest:ControlpropertychangeleadsmodelfieldchangeStep1–ModeldirectivedetectionStep2–生成事件处理器源码Step3–将事件处理器注册到物理DOM元素Step4–modelfield会在onInput事件处理器中发生变化最近自学Vue我在互联网上发现很多文章都对Vue的反应式双向数据绑定特性赞不绝口。这让我想起了2013年初的时候自学UI5,那时候UI5已经支持Two-WayDatabinding了。UI5中的Two-waydatabinding我曾经在我的博客中比较过DataBinding机制:比较数据绑定机制ism:SAPUI5和Angular。现在我将重用为我的博客创建的按钮使用代理模式在UI5中实现更好的图像加载行为以回忆UI5双向数据绑定。我在XML视图中定义了一个简单的按钮:在controller的onInit函数中,text属性绑定到JSON模型中的“field_for_text”字段:onInit:function(){varoModel=newsap.ui.model.json.JSONModel();varmyData={"field_for_text":"Jerrybuttonlabel"};oModel.setData(myData);varbutton=this.getView().byId("jerryButton");button.setModel(oModel);button.bindProperty("文本","/field_for_text");button.oModel=oModel;}双向数据绑定测试:控件属性变化导致模型字段变化在Co中键入以下脚本nsole.在我按下回车键之前,“field_for_text”字段仍然是UI中显示的当前标签“Jerrybuttonlabel”:按下回车键后,模型字段也发生了变化。这个方向的同步逻辑(control->model)已经在我的博客中解释过:HowIdoself-studyonagivenFioricontrol–part7UI5bindingmode.Twowaydatabindingtest:modelfieldchangeleadstocontrolpropertychangeNow让我们做相反的事情。在我更改模型字段并在控制台中按回车键后,没有任何反应。为了使模型字段的更改流向控制属性,有必要调用JSON模型的刷新功能。原因是:当控制属性被绑定时通过我控制器中onInit函数中的这一行来建模字段:utton.bindProperty(“text”,“/field_for_text”);模型更改处理程序被注册为模型更改事件的侦听器,该事件将在调用刷新函数时引发。在此更改处理程序中,控件属性将根据模型字段的更改进行更新。Vue中的双向数据绑定我使用的Vue版本是2.3.4。我只是使用Vue教程中提供的helloworld示例进行检查它的双向数据绑定特征。

{{message}}

双向数据绑定测试:模型字段变化导致控制属性变化通过代码在控制台中更改模型字段:jerry.$data.message=“JerrychangeinConsole”;并键入回车键,UI会做出相应的反应:这种同步方向的机制是,当Vue应用启动时,compiled属性在函数defineRe中被注册为一个“reactive”字段active:在此函数中,Object.defineProperty的本机实现用于将自定义设置器注册到反应字段,只要该字段发生更改,就会调用它。当您在控制台中更改此字段的值时,旧值“HelloWorld”被新值“JerrychangeinConsole”覆盖,并且dep.notify将触发与此模型更改相关的控件:在patchVnode函数中,旧DOM节点将被替换为具有修改属性的新DOM节点在控制台完成:最后,新的DOM元素的属性textContent填充了反应字段的新值,之后我们可以立即在UI中看到这个最新值:双向数据绑定测试:控件属性更改导致模型字段更改我做了一些示例的小改动:

{{message}}

现在每当我在输入字段中键入内容时,模型字段消息也会更改。这在Vue中是如何实现的?Step1–模型指令检测在挂载阶段,指令v-model被解析,提取并存储在输入元素的属性指令中:Step2–根据前面提取的指令生成输入字段的事件处理程序源代码step正是这一行生成的代码将用户输入写回模型字段:if($event.target.composing)return;message=$event.target.value指令“v-model=”的完整生成源代码message”可以从下面的代码中找到。一个真正的JavaScript函数是用这个生成的源代码作为函数体动态创建的,它将被用作concrete物理DOM元素的事件处理程序。第3步–将事件处理程序注册到物理DOM元素中使用本机函数addEventListener完成注册。第4步–模型字段将在onInput事件处理程序中更改现在只要您在输入字段中键入内容,事件处理程序在步骤2中创建并在步骤3中注册的将捕获此事件并做出相应的反应。模型字段现在已更改!总结从根本上说,根据上述分析,UI5和Vue都使用观察者模式来实现双向数据绑定。唯一不同的是,对于控件和模型之间的通知,UI5使用了自己的双向Observer代码。在Vue中,模型到控件的通知也是自己实现的,而本博客例子中的控件到模型的通知是通过HTML原生事件实现的。要获取更多Jerry的原创文章,请关注公众号“汪子熙”: