设置新模型后,Formatter参数将传递为null

问题描述 投票:2回答:2

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

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

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

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

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

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

sapui5
2个回答
2
投票

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

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

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

优秀的做法是让格式化程序返回一些有用的东西(至少是一个空字符串),即使它的输入很糟糕,很容易因为不同的原因而发生(模型尚未存在,数据尚未加载,......)。这将阻止您的UI显示“未定义”等难看的东西。

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

BR克里斯


0
投票

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

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

也许这根本不是必需的,假设可以将ActivityLogsSet直接绑定到List。之后你可以打电话给refresh from ODataListBinding

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

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

然后在控制器的某个地方:

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?

© www.soinside.com 2019 - 2024. All rights reserved.