当前位置: 首页 > Web前端 > HTML

单步调试分析SAPUI5setProperty的执行逻辑

时间:2023-03-28 00:34:16 HTML

按照Jerry文章介绍的代码,运行后,给sap.ui.model.type.Currency类型的字段设置一个非数值,trigger该数据类型内置的数据校验机制,显示Enteranumber的错误信息。SAPUI5应用开发教程46-使用MessageManager实现开箱即用的验证(Validation)信息抛出本文介绍了SAPUI5ManagedObject的setProperty方法的执行原理。首先什么是ManagedObject?托管属性表示ManagedObject的状态。它们可以存储简单数据类型的单个值,例如“字符串”或“整数”。它们有一个名称(例如“size”)和获取当前值(getSize)或设置新值(setSize)的方法。当通过调用setter修改属性时,ManagedObject被标记为无效。可以使用#bindProperty方法将托管属性绑定到sap.ui.model.Model中的属性。对模型属性的更新将自动反映在托管属性中,并且-如果TwoWay数据绑定处于活动状态,对托管属性的更改将反映在模型中。可以通过调用#unbindProperty删除现有绑定。当输入控件失去焦点时,会触发onsapfocusleave。该方法调用onChange:传入入参,事件类型为sapfocusleave:如果当前最新值不等于上一个值getLastValue(),则调用this.setValue:Input.setValue调用InputBase.setValue:setValue最后调用setProperty,属性名为value:正式进入setProperty方法,首先从mProperties中获取修改前的value:然后执行validateProperty:在validateProperty内部,首先从this.getMetadata().getManagedProperty(sPropertyName)中读取获取value属性的元数据:SAPUI5控件的元数据设计可以参考我的文章:深入学习SAPUI5框架代码系列之四:SAPUI5控件的元数据实现。获取字符串类型对象:该类型对象由一系列函数组成:执行归一化操作:将此非法值设置为this.mProperties[sPropertyName]。双向绑定的逻辑处理:this.updateModelProperty获取绑定对象:进入双向绑定的处理分支:if(oBinding&&oBinding.getBindingMode()==BindingMode.TwoWay){oBindingInfo.skipPropertyUpdate++;SyncPromise.resolve(oValue).then(function(oValue){returnoBinding.setExternalValue(oValue);}).then(function(){oBindingInfo.skipPropertyUpdate--;returnoBinding.getExternalValue();}).then(函数(oExternalValue){if(oValue!=oExternalValue){that.updateProperty(sName);}handleSuccess();}).catch(function(oException){oBindingInfo.skipPropertyUpdate--;handleException(oException);}).unwrap();SyncPromise.resolve(oValue).then(function(oValue){返回oBinding.setExternalValue(oValue);})CompositeBinding.js内部,核心逻辑是第325行的代码:that.oType.parseValue(oValue,that.sInternalType,aCurrentValues);调用outputFormat解析输入值: