SAPUI5 - 绑定问题

Posted

技术标签:

【中文标题】SAPUI5 - 绑定问题【英文标题】:SAPUI5 - Bindingproblem 【发布时间】:2016-06-30 07:56:23 【问题描述】:

我尝试修复此问题几个小时,但看不到我的错误。我尝试做一个简单的绑定:

在我的 index.html

data-sap-ui-xx-bindingSyntax="complex"

...

var oModel = new sap.ui.model.json.JSONModel();
oModel.loadData("model/data.json");
sap.ui.getCore().setModel(oModel);

在我的 App.view.xml 中

...
<Page title="/greeting">
...

数据.json


"greeting": "hey"

我看不出这里有什么问题。 即使是调试期间的 sap.ui.getCore().getModel() 也会给我一个带有 "greeting":"hey" 的 oData 变量的对象。

希望大家帮忙

我还在此处发布了原始问题。但由于我简化了它,我应该在一个单独的问题中发布它。 Binding in List with XML

---------更新--------

this.getView().setModel(oModel); -> 作品

sap.ui.getCore().setModel(oModel); -> 不工作

【问题讨论】:

【参考方案1】:

我认为您的意思是在您的应用程序中使用绝对绑定路径。这意味着你必须在它前面加上一个斜杠:

<Page title="/greeting">

您可以在此处找到有关 JSON 模型的绑定路径语法的更多信息:http://help.sap.com/saphelp_hanaplatform/helpdata/en/d5/2e364907f94a3caeb4f5e5ad0cf302/content.htm

我注意到的另一件事是您声明了 oModel,但将数据加载到 oPositoModelionsModel 中。我认为您打算将数据加载到 oModel 中:

var oModel = new sap.ui.model.json.JSONModel();
oModel.loadData("model/data.json");
sap.ui.getCore().setModel(oModel);

其余代码看起来非常合法。看看this jsbin,我在其中稍微修改了您的代码,以便从Star Wars API 中提取数据。

如果模型没有从核心继承到您的视图,则继承链接可能在某处断开。这发生在例如对话框。对话框不会添加到 UI 树中,但 addDependent 方法仍会将对话框连接到底层 UI 组件(例如视图)的生命周期管理和数据绑定。您可以在Step 16 of the UI5 walk-through 阅读更多相关信息。

【讨论】:

对不起,我的错。在我的原始代码中有 /greeting。只是问题中的错字我现在也在我的问题中更改了它。 在您的代码中发现另一个可能的错误以及基于您的代码的工作示例。 再次:只是一个错字。在代码中只有一个 oModel 而没有 oPositionsModel。抱歉发了这么多错别字。在问题中也对此进行了编辑。 我想你应该看看包含你的代码片段的 jsbin。它也从外部服务中提取数据。将其与您自己的代码进行比较,在两者之间交换一些代码,看看它何时中断。当它坏了,你就找到了罪魁祸首。 请看看我的更新。我确实看过,但 【参考方案2】:

如果您将模型分配给应用程序的全局命名空间 (sap.ui.getCore().setModel()),则模型应自动绑定到视图。您可以将它们直接绑定到视图(或页面本身)。

建议将模型分配给视图(除非您要存储跨视图数据,在这种情况下您可以将其分配给核心 - 但建议为此模型添加名称。

所以只需在视图的控制器中使用this.getView().setModel() 将模型移动到视图。 (当您尝试存储视图名称时,它似乎是特定于视图的模型)。

【讨论】:

谢谢。但是 SAP 的文档 (help.sap.com/saphelp_hanaplatform/helpdata/en/91/…) 说这是可能的。和 sap.ui.getCore().setModel(oModel, "data");也不工作 这也不是真的。模型从它们的父控件继承。核心 -> 组件 -> 视图。我在答案中发布的 jsbin 证明了这一点。确实,将模型链接到组件或视图而不是核心是一种很好的做法。这例如允许您从 Fiori Launchpad 运行您的应用,而不会与同样使用核心的其他应用(例如 FLP 本身)发生冲突。 这在 UI5 上不是一个明确的话题,但根据我的经验(和官方 UI5 应用程序),将视图特定模型用于 UI 相关/配置数据更安全。当然,如果您在 manifest.json 中定义一个模型,它将是一个全局模型,并且可以根据需要从每个视图中访问。除此之外,如果您在项目中使用组件,则可以将模型分配给组件本身(带有名称)。这样,您的模型将在每个视图中都可用。 对不起,这也是错误的。清单是从某个地方加载的,大多数时候是应用程序的组件。这意味着清单中定义的模型连接到该点(例如组件),而不是核心。因此它们在全局范围内不可用,并且只能从从该组件继承的视图中可用。 很高兴看到,这里有一些问题,这不仅仅是我的误解 :D 我是否可以: 1. 使用组件模型查看交叉的东西(在清单或 Component.js 中定义), 2. 将视图模型用于一个视图的东西和 3. 不要使用核心模型,因为其他一些应用程序可能也使用核心模型?

以上是关于SAPUI5 - 绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

SAPUI5中如何实现数据绑定?

SAPUI5绑定JSON模型来控制

SAPUI5 何时将初始过滤器绑定到控件

SAPUI5 将下拉框的值绑定到另一个控件的属性

SAPUI5 列表绑定与 XML 视图中的过滤数据

SAPUI5 将数组行索引绑定到 xml 视图中的数组行数据