我有一张SAPUI5表。我想要的是提供一个文本字段,用户可以在其中输入时间间隔(例如3分钟),并且表格将在3分钟后自动刷新。此外,如果他提供新值(例如8分钟),表格将在8分钟后刷新。
任何人都可以提出一些想法,我该如何实现这一目标?提前致谢。
答案 0 :(得分:0)
window.setInterval
可用于以特定时间间隔调用函数。
window.clearInterval
可用于终止它。
在文本中附加更改处理程序,清除所有现有间隔并使用新时间开始新的间隔。
<Input change="onInputIntervalChange" />
onInputIntervalChange: function(oEvent) {
var sIntervalInMinutes = oEvent.getParameter("newValue");
var iIntervalInMinutes = parseInt(sIntervalInMinutes);
var iIntervalInMillisec = iIntervalInMinutes * 60 * 1000;
window.clearInterval(this._intervalId);
this._intervalId = window.setInterval(function(){
// refresh your table
}.bind(this), iIntervalInMillisec);
}
请记住,第一次刷新将在时间间隔过后发生。如果要在用户更改值时立即刷新表,请在setInterval
之前直接调用刷新方法。
答案 1 :(得分:0)
这取决于您使用的是哪种桌子。 你总是可以调用oTable.getBinding(“x”)。refresh(),“x”是“items”或“rows”。但如果没有显示所有内容,那可能会导致桌子忘记滚动位置。
因此,“真正的”解决方案是找出当前显示的数据片段,然后再次从后端读取完全相同的数据。使用v2.ODataModel上的read方法,模型还存储新数据并更新表中的属性绑定。
答案 2 :(得分:0)
正如@sirion所说,这取决于你有什么表,你想要你的滚动表现如何等等。我认为你的桌子不可避免地会以某种方式“轻推”,例如:在刷新之间插入新行或者删除某些谎言。
尽管如此,我会说最好的选择是从表中获取ListBinding(如sirion所说)并对此绑定进行刷新:
onRefreshTriggered: function () {
this.byId("myTable").getBinding("items" /* or "rows" */).refresh();
}
刷新每行的元素绑定可能也是一个想法,那么你肯定不会遇到滚动问题(但是如果删除或添加了行,你会遇到问题)。
onRefreshTriggered: function () {
(this.byId("myTable").getItems() || []).forEach(function (oItem){
oItem.getElementBinding(/* model name */).refresh();
});
}
对于定期触发部分,我会使用sap.ui.core.IntervalTrigger类。它很容易使用:
// e.g. in onInit:
this._trigger = new IntervalTrigger(3 * 60 * 1000 /* initial interval */)
this._trigger.addListener(this.onRefreshTriggered, this);
// in a separate method, e.g. as a input field change event
onIntervalChange: function(oEvent) {
var iInterval = parseInt(oEvent.getSource().getValue(), 10);
this._trigger.setInterval(iInterval * 60 * 1000);
}