将标签绑定到sapui5中的模型长度

时间:2017-07-05 19:11:14

标签: sapui5

我正在尝试将标签绑定到component.js中定义的模型的长度。我可以获得组件中的长度,但是当我尝试映射相同的内部视图时,它返回 undefined 。我已将表绑定到该模型,并且能够在表中获取数据。

这是我在component.js

中的代码
var oModel = new sap.ui.model.json.JSONModel("model/data.json");
var datacount ;
oModel.attachRequestCompleted(function() {
     // console.log(this.getData().length);
     datacount = this.getData().length; //I am able to get length here
    oModel.setData({
        struct : this.getData(),
        number: datacount
    });
});
this.setModel(oModel, "MyJsonData");

内幕:

oTable.bindRows("MyJsonData>/struct/");
var lbl = new sap.ui.commons.Label({text: "{MyJsonData>/number}"});

标签没有返回任何内容?

1 个答案:

答案 0 :(得分:0)

当您声明MyJsonData时,您的模型Label尚不可用。

我尝试了一个类似的例子并观察了这个控制流程:

组件init() - > view Controller - > setModel()声明 - > requestCompleted处理程序

因此,如果我绘制时间线,这就是我所看到的:

  1. Label没有可用的模型时,您的Component会被实例化。
  2. 您的模型是在没有number属性的情况下创建的。
  3. 您将number属性添加到现有模型MyJsonData
  4. 解决方案:

    在视图的控制器和requestCompleted处理程序中执行所有操作。

    requestCompleted事件异步工作,即允许在等待加载数据时进一步执行。因此,处理程序方法之外的任何语句都会在处理程序发挥其魔力之前执行

    注意:

    • 您可以使用controller.getOwnerComponent()检索Component的实例并在其上设置模型。
    • 您的事件处理程序不知道oModel是什么。您必须在setData上致电this
    • 如果您尝试检索Label的文本而不先将其添加到UI DOM,请确保明确将模型绑定到它。

    换句话说:

    var lbl = new sap.ui.commons.Label({
        text: "{MyJsonData>/number}"
    });
    console.log(lbl.getText());
    

    将无效,因为您尚未将lbl添加到视图中,因此无法访问模型。但是,如果您这样做,它肯定会在浏览器控制台中打印文本:

    var lbl = new sap.ui.commons.Label({
        text: "{MyJsonData>/number}"
    }).setModel(oModel, "MyJsonData");
    

    最后,没有人再使用sap.ui.commons了。我建议你切换到sap.m

    干杯!