设置新模型后,格式化程序参数将传递为空

时间:2019-02-20 13:54:17

标签: sapui5

在用于List对象的XML中,我使用了格式化程序:

{path: 'Erdat', formatter: '.formatter.dateFormatter'}

这按预期方式工作,我可以看到Erdat的绑定值已传递到dateFormatter中,然后进行了适当的格式化。但是,在我的应用程序上,我可以选择重新调用后端网关服务,该服务会将新获取的数据重新绑定到列表(listLogs):

oActLogs.read("/ActivityLogsSet", {
  success: function (oData, oResponse){
    oActivityLogsModel.setData(oData);
    listLogs.setModel(oActivityLogsModel);
    oGlobalBusyDialog.close();
  },
  // ...
});

这有效,我可以看到从服务中获取了新数据。但是,当我将此新模型设置为listLogs时,格式化程序已被命中,但这次正在传递null,然后在格式化程序尝试对此值进行任何操作时崩溃。

我已经调试并看到在第二次调用中获取的数据不为null,那么为什么将null传递给格式化程序?

2 个答案:

答案 0 :(得分:2)

如果我不得不猜测,绑定中的任何更改都将触发格式化程序。在绑定新模型之前,这也可能是“解除绑定”事件。或者在实际加载数据之前绑定新模型。

为什么不只在格式化程序中执行以下操作?

dateFormatter: function(oValue) {
  if (!oValue) {
    return "";
  }
  // do the real stuff
}

优良作法是使格式化程序返回有用的内容(至少是一个空字符串),即使其输入很糟糕,由于各种原因(模型不存在,数据尚未加载等)也很容易发生。这样可以防止您的UI显示“未定义”之类的丑陋内容。

顺便说一句:您是否考虑过使用Types进行日期格式化?

BR 克里斯

答案 1 :(得分:0)

  

我(...)将新获取的数据重新绑定到列表中。

oActLogs.read("/ActivityLogsSet", {
  success: function (oData, oResponse){
    oActivityLogsModel.setData(oData);
    listLogs.setModel(oActivityLogsModel);
    oGlobalBusyDialog.close();
  },
  // ...
});

假设完全可以将ActivityLogsSet绑定到列表,也许根本不需要这样做。之后,您可以致电refresh from ODataListBinding

示例

<List id="listLogs" items="{/ActivityLogsSet}"> <!-- in place of oActLogs.read() -->

(聚合绑定负责发送请求并将数据设置到列表。)

然后在控制器中的某处:

onRefreshButtonPress: function() {
  this.byId("listLogs").getBinding("items")/*ODataListBinding*/.refresh();
},

绑定发送新请求(refresh())之后,格式化程序将在接收到数据时触发,但具有适当的值,而不是从一开始的null


{path: 'Erdat', formatter: '.formatter.dateFormatter'}

您甚至可能不需要自定义dateFormatter。参见How to Add Date / Time from OData Service Correctly to UI?