【问题标题】:UI5: Bind a simple property of a control to a property of an OData entityUI5:将控件的简单属性绑定到 OData 实体的属性
【发布时间】:2016-09-05 18:24:18
【问题描述】:

我有一个成功用于填充的 OData 模型,例如。 SAPUI5 应用中的表格:

<Table items="{globalSettings>/APP_GLOBAL_PREFERENCES/}">

等等

实体集APP_GLOBAL_PREFERENCES 由具有KEYVALUE 属性的实体组成,KEY 是关键。

现在,我正在尝试将 &lt;Text&gt;control 的 textproperty 绑定到实体的特定实例的属性:

<Text text="The base URL is '{globalSettings>/APP_GLOBAL_PREFERENCES('BASE_URL')/VALUE}'" />

为了让它工作,我必须按照here 的建议创建一个元素绑定。就我而言,我在关联控制器的生命周期方法onBeforeRendering 中执行此操作:

onBeforeRendering: function () {
  this.getView().bindElement({
    path: '/APP_GLOBAL_PREFERENCES',
    model: 'globalSettings'
  });
}

我不明白为什么这一步是必要的,我想避免它。 谁能解释为什么需要这一步,或者有没有人知道没有它怎么办?

【问题讨论】:

    标签: odata sapui5


    【解决方案1】:

    在 UI5 中,有 3 种类型的绑定:

    • 聚合绑定可以与聚合一起使用(例如表或列表items)。从数据的角度来看,这需要一组对象。在这种情况下,您必须配置一个所谓的模板,该模板将为聚合的每个实例重复。在这里,您需要使用相对绑定,因此您不必在绑定路径中包含数组引用本身。

    • 元素绑定用于将模型中的对象绑定到控件(视图也是控件!)。如果控件有任何子元素,则可以使用相对绑定将这些子元素绑定到此对象的任何属性。**

    • 属性绑定是绑定过程的基本部分;每个控件都有或多或少的属性,您可以使用属性绑定将模型值分配给这些属性。

    ** 这意味着,在您的Text 控件中,您必须使用相对绑定,因此只需使用{VALUE}。但是,请确保如果您的模型中的 APP_GLOBAL_PREFERENCES 指向一个数组,您必须在您的 bindElement 中选择一个特定的项目(例如:

    this.getView().bindElement({ path: '/APP_GLOBAL_PREFERENCES('BASE_URL')', model: 'globalSettings' });)。

    编辑: 好的,现在我看到了你的问题!回答你的问题:没必要。

    如果您使用this.getView().bindElement(..) 属性,您可以在您的文本控件中使用相对路径(假设您在此段中包含正确项目的选择)。我的示例基于 JSONModel:

    this.getView().bindElement({ path: '/APP_GLOBAL_PREFERENCES/0', model: 'globalSettings' });

    然后你可以在你的视图中这样做: &lt;Text text="{globalSettings&gt;text}" /&gt;

    如果您跳过 bindElement(但您已将模型分配给视图),则需要使用以下路径: &lt;Text text="{globalSettings&gt;/APP_GLOBAL_PREFERENCES/0/text}" /&gt;

    如果你正在实现一个详细视图,它获取所选项目的 ID 作为 URL 参数,建议使用 bindElement 与给定参数的选择;然后在您的 XML 视图中,您可以使用相对绑定,而不必关心项目的 ID。

    【讨论】:

    • 我认为我最初的问题有点不清楚:我正在谈论的 Text 控件不是在聚合中,例如 @987654335 的 items @ - 它位于视图的“顶层”。我提出的解决方案确实按我的预期工作 - 我只是想知道(任何原因)带有 absolute path 的声明性 property binding 是否不起作用,除非我也创建父控件上的 元素绑定。也许您可以详细说明一下?
    • 非常感谢您的回复,我同意它应该按照您描述的方式工作 - 但不幸的是它不适用于 OData 模型。正如您从我最初的问题中看到的那样,我已经将您建议的绝对绑定路径用于属性绑定(尽管我不能使用 /APP_GLOBAL_PREFERENCES/0/VALUE 语法,因为我对首选项中的随机第一个元素不感兴趣数组,但元素具有特定键,所以我使用/APP_GLOBAL_PREFERENCES('BASE_URL')/VALUE,这是正确的语法并且确实有效) - 但前提是我事先创建了元素绑定。
    • 还有一条信息:我认为我需要创建元素绑定(到父控件)或属性绑定不起作用的观察是不正确的。实际上需要的是实体集发生读取请求。当我手动触发这个读取请求(通过model.read('/APP_GLOBAL_PREFERENCES'))时,我可以按照您的建议使用绝对绑定路径(尽管使用('BASE_URL')-syntax 描述)。这非常令人失望,我倾向于认为它是 OData 模型的错误。但我愿意接受不同的解释。
    • 我测试过,你是对的。但是,我不认为这是一个错误,这只是一种行为。属性绑定本身不会对基础 OData 服务进行查询。所以如果你想使用它,你必须先获取数据,例如使用 read() 函数。使用这种技术可以避免意外的数据请求(因为您可以在视图中使用多个属性绑定,并且如果您使用绝对绑定,是否必须获取数据并不总是很清楚)。
    • 非常感谢您的努力。我认为我们已经澄清了情况,你说得对,这“只是一种行为”。甚至是documented behavior(请参阅开头的注释)。为了展示这种至少让我感到惊讶的“行为”,我还创建了一个jsbin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多