2014-08-28 98 views
13

我一直在思考上下文,上下文绑定和绑定上下文的内部和关系,现在我已经有几天了,我不确定在我这边是否有一个主要的误解。也许你们中的一些人可以帮我整理一下。我正在把我的假设放在下面。我可能想首先说我总是在这里使用oData模型。ui5中的绑定,上下文,上下文绑定和绑定上下文

这是什么,我相信理解阅读文档:

一个背景是在模型中的数据对象的引用。

结合基本上一个事件提供器,其(在单向结合时)观察到特定的上下文的状态,并且当它被改变/数据加载发射事件...并因此允许用于登记事件处理程序针对该特定情况下的事件。在编程对象方面,有属性绑定和列表绑定(这是真的 - 或是列表绑定所有相关的?)。无论如何,我的理解是,列表绑定是组件的聚合绑定的模型端,而属性绑定既是从组件的角度来看,也是从模型的角度来看(混淆?)。

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

什么也似乎很奇怪是当你想创建一个上下文本身new sap.ui.model.Contextabov(oModel, sPath, oContext)再次采用上下文。 我相信这只是我所看到的一个不幸的命名事物,但我不太确定。

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

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

  • 创建列表,经由model.bindList()只传递一个路径结合上下文。
  • 附着变更事件处理程序结合
  • 呼叫get_contexts()上结合
  • 接收change事件处理数据(和看到的OData属性填入的型号)。

而且似乎没有做同样的绑定属性,它我会承担我可以通过model.bindProperty()产生的方式。我可以生成绑定,但我收到的绑定似乎没有处理实际获取数据。

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

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

干杯 米歇尔

回答

7

你的问题如下回答。希望能帮助到你。

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

    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()
    在更改事件处理程序中接收数据(并查看在模型中填充的oData属性)。

    似乎没有办法做同样的属性绑定,我会假设
    我可以通过model.bindProperty()生成。我可以生成绑定,但绑定接收似乎没有处理来实际获取数据。

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

2

谢谢,艾伦,真的有帮助。这实际上主要是关于文档的一个混淆,getValue也是如此。

为了另一个答案加起来也只有隐含在标题中的问题:

方面结合:绑定设置了给定的路径。

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

Cheers Michel