【问题标题】:Binding, Context, ContextBinding and BindingContext in ui5ui5中的Binding、Context、ContextBinding和BindingContext
【发布时间】:2014-10-22 07:31:49
【问题描述】:

几天来,我一直在思考上下文、上下文绑定和绑定上下文的内部结构和关系,我不确定我这边是否存在重大误解。也许你们中的一些人可以帮我解决这个问题。我把我的假设放在下面。我可能首先想说的是,我在这里总是使用 oData 模型。

这就是我相信阅读文档所理解的:

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

binding 基本上是一个事件提供程序,它(在单向绑定的情况下)观察特定上下文的状态并在它更改/数据加载时发出事件......因此允许用于为该特定上下文上的事件注册事件处理程序。在编程对象方面,有属性绑定和列表绑定(这是真的 - 还是列表绑定所有相关的东西?)。

无论如何,我的理解是列表绑定是组件聚合绑定的模型端,而从组件和模型的角度来看,属性绑定都称为属性绑定(令人困惑?)。

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

看起来很奇怪的是,当您想自己创建上下文时,new sap.ui.model.Contextabov(oModel, sPath, oContext) 再次获取上下文。 我相信这只是我看到的一个不幸的命名问题,但我不太确定。

然后是上下文绑定和绑定上下文。我假设 contextBinding 是与 e 描述的特定上下文的绑定。绑定上下文是关于上下文或列表绑定的元数据。

从编程的角度来看,我不明白为什么以下工作:

  • 仅通过 model.bindList() 传递路径来创建与上下文的列表绑定。
  • 将更改事件处理程序附加到绑定
  • 在绑定时调用get_contexts()
  • 在更改事件处理程序中接收数据(并查看模型中填充的 oData 属性)。

似乎没有办法对属性绑定做同样的事情,我假设我可以通过model.bindProperty() 生成。我可以生成绑定,但我收到的绑定似乎没有实际获取数据的句柄。

我希望这篇文章能解释我的问题。如果你问:你想做什么?我实际上不想用它做任何事情,我只是不太明白它是如何工作的。绑定到 ui 控件等工作得很好,但我更愿意真正了解引擎盖下的内容。我一直在阅读调试文件和单元测试,但与你们讨论似乎也是一种好方法。

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

干杯 米歇尔

【问题讨论】:

    标签: sapui5


    【解决方案1】:

    您的问题在下面得到解答。希望对您有所帮助。

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

    oContext就是你上面提到的上下文,准确的说是sap.ui.model.Context

    1. 看起来也很奇怪的是,当您想自己创建一个上下文时,新的sap.ui.model.Context(oModel, sPath, oContext) 会再次获取一个上下文。我相信这只是我看到的一个不幸的命名问题,但我不太确定。

    我猜here 的文档让你感到困惑。实际上,sap.ui.model.Context 只接受 oModel 和 sPath 作为参数。以下代码是我从sap-ui-core.js 得到的。可以看到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"
            ]
        }
        
        });
    
    1. 从编程的角度来看,我不明白为什么以下工作:
    • 通过仅传递路径的 model.bindList() 创建与上下文的列表绑定。
    • 将更改事件处理程序附加到绑定
    • 在绑定时调用 get_contexts()
    • 在更改事件处理程序中接收数据(并查看模型中填充的 oData 属性)。

    似乎没有办法对属性绑定做同样的事情,我假设我可以通过 model.bindProperty() 生成。我可以生成绑定,但我收到的绑定似乎没有实际获取数据的句柄。

    其实你也可以attachChange事件到sap.ui.model.PropertyBinding,你可以调用getValue()来获取数据。

    【讨论】:

      【解决方案2】:

      谢谢,艾伦,这真的很有帮助。这实际上主要是对文档的混淆,并且 getValue 也让我失望了。

      为仅隐含在标题中的问题添加另一个答案:

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

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

      干杯 米歇尔

      【讨论】:

        猜你喜欢
        • 2022-10-15
        • 1970-01-01
        • 2021-08-05
        • 2019-10-10
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多