在控制器

时间:2017-07-26 08:28:09

标签: javascript odata sapui5

我尝试从OData源准备数据,以便在我的fiori应用中以条形图显示。为此,我在manifest.json中设置了OData模型。使用列表进行测试,只需使用

items="{path : 'modelname>/dataset'}

工作正常并显示内容。

为了准备图表的数据(VizFrame),我在视图的控制器(mvc:XMLView)中使用了onInit()函数。数据准备与question中讨论的类似。

首先我获得了ODataModel:

var oODataModel = this.getOwnerComponent().getModel("modelname");

接下来我做绑定:

var oBindings = oODataModel.bindList("/dataset");

不幸的是,oBindings().getContexts()数组始终为空,oBindings.getLength()也为零。因此,VizFrame仅显示"无数据"。

可能是在onInit()函数期间数据模型没有完全加载,还是我误解了访问数据的方式?

提前致谢

更新 我暂时通过使用自动创建的绑定来解决问题,该视图将数据显示为列表。我grep" dataReceived"来自绑定getView().byId("myList").getBindings("items")的事件并在那里进行计算。该图的模型(因为它在不同的视图中使用)在Component.js中创建,并在Core sap.ui.getCore().setModel("graphModel")中注册。 我认为这个解决方案很脏,因为图表数据取决于来自不同视图的列表数据,这会导致问题,例如:当您使用增长列表时(因为绑定中的数据得到更新,并且从odata模型中选择了不同的范围)。 任何建议,我如何获得odata模型条目而不依赖于不同的列表?

4 个答案:

答案 0 :(得分:2)

以下图片概述了UI5应用程序的生命周期。

enter image description here

重要的是用红色圆圈突出显示的步骤。基本上,在您的onInit中,您无法通过this.getView().getModel()完全访问您的模型。

这可能是您尝试使用this.getOwnerComponent().getModel()的原因。这使您可以访问模型,但它尚未绑定到视图,因此您无法获得任何上下文。

类似地,metadataLoaded()返回一个过早填充的Promise:在加载元数据之后,可能在任何视图绑定完成之前。

我通常做的是

  • 使用onBeforeRendering

这是在onInit之后立即调用的生命周期钩子。视图及其模型存在,但尚未向用户显示。很有可能用你的模型做事。

  • 使用onRouteMatched

这不是一个生命周期挂钩,而是一个可以绑定到应用程序的路由器对象的事件处理程序。由于您在onInit中定义了事件处理程序,因此稍后会调用它(但不会太晚),然后您可以执行所需的操作。这显然只有在您设置路由时才有效。

答案 1 :(得分:1)

您必须等到加载模型元数据。试试这个:

onInit: function() {
    var oBindings;
    var oODataModel = this.getComponent().getModel("modelname");
    oODataModel.metadataLoaded().then(function() {
        oBindings = oODataModel.bindList("/dataset");
    }.bind(this));
},

答案 2 :(得分:0)

  

可能是onInit()期间数据模型没有完全加载   功能,还是我误解了访问数据的方式?

您可以在执行列表绑定之前测试您的模型是否由控制台完全加载日志

console.log(oODataModel);
var oBindings = oODataModel.bindList("/dataset");

如果你的模型没有数据,那就是问题所在。

答案 3 :(得分:0)

我的基本误解是强制使用绑定。这似乎只适用于组织数据处理的UI元素。我切换到了

oODataModel.read("/dataset", {success: function(oEvent) {
    // do all my calculations on the oEvent.results array
    // write result into graphModel
    }
});

整个计算是附加到graphModel的requestSent事件的函数,该事件被设置为视图/控制器的onBeforeRendering部分中的VizFrame的模型。