Sapui5 ui5中的绑定、上下文、上下文绑定和绑定上下文

Sapui5 ui5中的绑定、上下文、上下文绑定和绑定上下文,sapui5,Sapui5,几天来,我一直在思考context、contextbinding和bindingcontext的内部结构以及它们之间的关系,我不确定我是否存在重大误解。也许你们中的一些人可以帮我解决。我把我的假设放在下面。首先我想说的是,我在这里总是使用oData模型 这就是我在阅读文档时所理解的: 上下文是对模型中数据对象的引用 绑定基本上是一个事件提供程序,它(在单向绑定的情况下)观察特定上下文的状态,并在更改/加载数据时发出事件。。。因此允许为特定上下文上的事件注册事件处理程序。就编程对象而言,有属性绑定

几天来,我一直在思考context、contextbinding和bindingcontext的内部结构以及它们之间的关系,我不确定我是否存在重大误解。也许你们中的一些人可以帮我解决。我把我的假设放在下面。首先我想说的是,我在这里总是使用oData模型

这就是我在阅读文档时所理解的:

上下文是对模型中数据对象的引用

绑定基本上是一个事件提供程序,它(在单向绑定的情况下)观察特定上下文的状态,并在更改/加载数据时发出事件。。。因此允许为特定上下文上的事件注册事件处理程序。就编程对象而言,有属性绑定和列表绑定(这是真的吗?或者列表绑定是所有相关的吗?)

无论如何,我的理解是列表绑定是组件聚合绑定的模型端,而属性绑定从组件和模型的角度都称为属性绑定(混淆?)

现在我不太明白的是: 上下文绑定
new sap.ui.model.ContextBinding(oModel、sPath、oContext、mParameters?、oEvents?)
以路径和上下文作为参数。我假设这个oContext不完全是上面描述的上下文,而是绑定上的一些元数据。这是正确的吗?或者这是路径参数所对应的路径的定义

另一个看起来很奇怪的是,当您想要创建一个上下文本身时
新的sap.ui.model.Contextabov(oModel、sPath、oContext)
再次获取一个上下文。 我相信这只是我看到的一个不幸的命名事件,但我不太确定

然后是contextbinding和bindingcontext。我假设contextBinding是对特定上下文的绑定,如e。bindingcontext是关于上下文或列表绑定的元数据

从编程的角度来看,我不理解为什么以下方法有效:

  • 通过仅传递路径的
    model.bindList()
    创建到上下文的列表绑定
  • 将更改事件处理程序附加到绑定
  • 在绑定时调用
    get\u contexts()
  • 在变更事件处理程序中接收数据(并查看模型中填写的oData属性)
对于属性绑定,似乎没有办法做到这一点,我假设我可以通过
model.bindProperty()
生成属性绑定。我可以生成绑定,但我收到的绑定似乎没有实际获取数据的句柄

我希望这番闲谈能解释我的问题。如果你问:你想做什么?实际上我不想对它做任何事情,我只是不太明白它是如何工作的。绑定到ui控件等等工作得很好,但我更愿意真正理解引擎盖下面是什么。我已经阅读了一些调试文件和单元测试,但和你们讨论它似乎也是一个很好的方式

如果这还不清楚,我很乐意添加任何有帮助的内容

干杯
米歇尔

下面回答了您的问题。希望能有帮助

  • 现在我不太明白的是:上下文绑定new
    sap.ui.model.ContextBinding(oModel、sPath、oContext、mParameters?、oEvents?):
    将路径和上下文作为参数。我假设这个oContext不完全是上面描述的上下文,而是绑定上的一些元数据。这是正确的吗?或者这是路径参数所对应的路径的定义
  • oContext就是您上面提到的上下文,确切地说是
    sap.ui.model.context

  • 另一个奇怪的现象是,当您想要创建一个上下文本身时,新的
    sap.ui.model.context(oModel、sPath、oContext)
    再次获取一个上下文。我相信这只是我看到的一个不幸的命名事件,但我不太确定
  • 我猜文件把你弄糊涂了。实际上,sap.ui.model.Context只接受oModel和sPath作为参数。下面的代码是我从中得到的。您可以看到JSDoc中关于参数的部分实际上与代码不一致。也许有一些打字错误

        /**
        * Constructor for Context class.
        *
        * @class
        * The Context is a pointer to an object in the model data, which is used to 
        * allow definition of relative bindings, which are resolved relative to the
        * defined object.
        * Context elements are created either by the ListBinding for each list entry
        * or by using createBindingContext.
        *
        * @param {sap.ui.model.Model} oModel the model
        * @param {String} sPath the path
        * @param {Object} oContext the context object
        * @abstract
        * @public
        * @name sap.ui.model.Context
        */
        var Context = sap.ui.base.Object.extend("sap.ui.model.Context", 
        /** @lends sap.ui.model.Context.prototype */  {
        
        constructor : function(oModel, sPath){
        
            sap.ui.base.Object.apply(this);
        
            this.oModel = oModel;
            this.sPath = sPath;
        
        },
        
        metadata : {
            "abstract" : true,
          publicMethods : [
                "getModel", "getPath", "getProperty", "getObject"
            ]
        }
        
        });
    
  • 从编程的角度来看,我不理解为什么以下方法有效:
    • 通过model.bindList()仅传递路径创建到上下文的列表绑定
    • 将更改事件处理程序附加到绑定
    • 在绑定时调用get_contexts()
    • 在变更事件处理程序中接收数据(并查看模型中填写的oData属性)
    对于我假设可以通过model.bindProperty()生成的属性绑定,似乎没有办法做到这一点。我可以生成绑定,但我收到的绑定似乎没有实际获取数据的句柄


    实际上,您还可以
    事件附加到
    sap.ui.model.PropertyBinding
    ,并且可以调用getValue()来获取数据。

    谢谢,Allen,这真的很有帮助。这实际上主要是对文档和getValue的混淆

    要为仅隐式包含在标题中的问题添加另一个答案,请执行以下操作:

    上下文绑定:设置到给定路径的绑定

    绑定上下文:给定绑定的上下文,即来自组件或其他设置绑定的上下文

    干杯 米歇尔