当前位置: 首页 > 知识库问答 >
问题:

数据绑定是如何在SAPUI5中实现的?

庄萧迟
2023-03-14

还有很多关于Angular中脏检查的探索博客,Vue.js和虚拟DOM中使用的Object.DefineProperty等等...

但在UI5文档中,只有如何使用数据绑定。没有关于如何实现数据绑定的详细信息。

我读过关于SAP.ui.base.ManagedObject的文档和它的源代码,在SAP.ui.base.ManagedObject的构造函数中,它说这些对象与数据绑定相关,但我不知道是如何绑定的。有时我会将它们注销以调试数据绑定,但仍然没有得到更好的结果:

        // data binding
        this.oModels = {};
        this.aPropagationListeners = [];
        this.oBindingContexts = {};
        this.mElementBindingContexts = {};
        this.mBindingInfos = {};
        this.mObjectBindingInfos = {};

我非常希望了解当数据模型发生变化时Dom是如何更新的,反之亦然。

共有1个答案

赵雪峰
2023-03-14

有评论称UI5使用了handlebar进行数据绑定,而经过搜索,handlebar只支持一次性数据绑定。我更好奇的是双向数据绑定是如何在UI5中实现的(很抱歉在第一时间没有讲清楚这一点)。

在handlebars中,一旦您编译了模板,视图/DOM就与数据模型无关了。

但双向数据绑定将数据连接到元素在其本地DOM中的属性或属性。这意味着:

当模型中的属性更新时,UI也会更新。更新UI元素时,更改会传播回模型。https://stackoverflow.com/A/13504965/5238583

在如何在JavaScript中实现DOM数据绑定的问题中,提到了许多技术。UI5使用了这两个(到目前为止我已经发现了这两个):添加变更事件监听器和mutators(setter)

我使用了这个官方示例作为例子:数据绑定-步骤13-元素绑定

调用OProductDetailPanel.BindElement({path:sPath,model:“products”});时,数据绑定将发生更改。

在ManagedObject.Prototype.UpdateBindingContext和ManagedObject.Prototype.UpdateProperty中设置Obinding.SetContext()中的断点。您可以在调用堆栈中看到它。

TL;DR:核心步骤为3、6、8

主要步骤有:

>

  • element.prototype.bindelement等于ManagedObject.prototype.bindObject

    Obinding.Initialize(),这意味着在ManagedObject.Prototype._BindObject中调用ClientContextBinding.Prototype.Initialize

    var fChangeHandler = function(oEvent) {
         that.setElementBindingContext(oBinding.getBoundContext(), sModelName);
    };
    oBinding.attachChange(fChangeHandler);
    oBindingInfo.modelChangeHandler = fChangeHandler;
    

    SetElementBindingContext()最终调用ManagedObject.Prototype.UpdateBindingContext

    UpdateBindingContext中,调用堆栈为OBinding.SetContext(oContext)->JSONPropertyBinding.Prototype.CheckUpdate(因为示例在此处使用了JSON模型)->This._FireChange({reason:ChangereSon.Change})

    对于第二个变更事件,处理程序在ManagedObject.Prototype._BindProperty中(ManagedObject的绑定函数中有许多fModelChangeHandler,对于我们的BindElement示例,我们只需要这一个)

    FModelChangeHandler中,调用ManagedObject.Prototype.UpdateProperty。在使用我们的setter(mutator)的地方:

    每当更改属性绑定时,此方法从属性绑定获取外部格式并将其应用于setter。

    此[OPropertyInfo._Smutator](oValue);。对于我们的示例OPropertyInfo._Smutatorsetvalue。执行此操作,InputproductID}”/>中的值将被更改。

  •  类似资料:
    • 请把这个问题当作严格的教育问题来处理。我仍然有兴趣听到新的答案和想法来实现这一点 如何用JavaScript实现双向数据绑定? 通过与DOM的数据绑定,我的意思是,例如,拥有一个带有属性的JavaScript对象。然后拥有一个DOM元素(例如),当DOM元素发生变化时,也会发生变化,反之亦然(也就是说,我指的是双向数据绑定)。 在简单的JavaScript中实现这一点的一些基本技术是什么? 具体来

    • 本文向大家介绍如何在Razor页面中实现数据模型绑定?相关面试题,主要包含被问及如何在Razor页面中实现数据模型绑定?时的应答技巧和注意事项,需要的朋友参考一下 使用bindproperty属性。  

    • 本文向大家介绍Nuxt.js 数据双向绑定的实现,包括了Nuxt.js 数据双向绑定的实现的使用技巧和注意事项,需要的朋友参考一下 假定我们有一个需求,一开始通过mounted()将一个字符串渲染在页面上,但是我们经过操作后修改了数据并且需要将得到的结果重新异步渲染到页面中去,而不是跳转刷新页面来重新渲染 首先模板中data()中定义数据,并且要将定义的数据显示出来 然后我们通过methods里的

    • 问题内容: 数据绑定在框架中如何工作? 我尚未在其网站上找到技术细节。数据从视图传播到模型时,或多或少地清楚了它是如何工作的。但是,AngularJS如何在没有设置者和获取者的情况下跟踪模型属性的变化? 我发现有些JavaScript观察程序可以完成这项工作。但是Internet Explorer 6和Internet Explorer 7不支持它们。那么AngularJS如何知道我更改了以下内容

    • 本文向大家介绍vue实现动态数据绑定,包括了vue实现动态数据绑定的使用技巧和注意事项,需要的朋友参考一下 实现的步骤: 1.监听对象属性的读取与变化 Object.defineProperty() 方法会直接在对象上定义一个新的的属性,或者已经存在的属性并且返回这个属性 语法是 Object.defineProperty(obj, prop, descript) obj: 目标对象 prop:

    • 本文向大家介绍Vue实现双向数据绑定,包括了Vue实现双向数据绑定的使用技巧和注意事项,需要的朋友参考一下 Vue实现双向数据绑定的方式,具体内容如下 Vue是如何实现双向数据绑定的呢?答案是前端数据劫持。其通过Object.defineProperty()方法,这个方法可以设置getter和setter函数,在setter函数中,就可以监听到数据的变化,从而更新绑定的元素的值。 实现对象属性变化