ui5中的绑定,Context,ContextBinding和BindingContext

时间:2014-08-28 12:23:10

标签: sapui5

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

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

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

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

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

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

当你想要创建一个上下文时,似乎很奇怪new sap.ui.model.Contextabov(oModel, sPath, oContext)再次获取一个上下文。 我相信这只是我看到的一个不幸的命名事项,但我不太确定。

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

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

  • 通过仅传递路径的model.bindList()创建列表绑定到上下文。
  • 将更改事件处理程序附加到绑定
  • 在约束
  • 上致电get_contexts()
  • 在change事件处理程序中接收数据(并查看模型中填充的oData-property)。

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

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

如果不清楚,我会很乐意添加任何有用的东西。

干杯 米歇尔

2 个答案:

答案 0 :(得分:7)

您的问题在下面得到解答。希望能帮助到你。

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

    oContext是您上面提到的上下文,确切地说,是sap.ui.model.Context

  2. 当你想要创建一个新的上下文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"
        ]
    }
    
    });
    
  3. 从编程的角度来看,我不明白为什么以下有效:

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

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

    实际上您还可以attachChange将事件发送到sap.ui.model.PropertyBinding,然后您可以调用getValue()来获取数据。

答案 1 :(得分:2)

谢谢,艾伦,这真的很有帮助。这主要是关于文档的混乱,getValue也让我感到很沮丧。

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

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

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

干杯 米歇尔