滚动时在同一行的表“ keeps”中编辑的数字位于同一行中(JSView)

时间:2019-06-03 09:08:46

标签: javascript sapui5

我有一个带有Input字段的sap.ui.table.Table,该表通过JSON获取数据,效果很好。但是,例如,如果我在第一行中编辑该值并尝试向下滚动,则该值将“停留”在第一行中,直到另一个值到达此字段为止。因此,它基本上在滚动时更新了除已编辑单元格之外的每个单元格。之后,我再次向上滚动以查看更改的值,但是此值现在具有从开始时的加载开始的旧值。 我认为绑定绑定的内容根本不正确,因为我还没有看到这样的内容。我知道表格只能更新行上下文,但我不知道如何做到这一点。

这里是一个示例:https://jsbin.com/yuvujozide/6/edit?html,console,output

编辑右侧的“门”并滚动,以查看消失的方式,然后编辑左侧的值,并滚动以查看值与表的滚动方式。

我试图删除/设置VisibleRowCount并登录以查看是否多次加载了数据,但事实并非如此。

var oModel = new sap.ui.model.json.JSONModel();
var oTable = new sap.ui.table.Table({
  visibleRowCount: 12,
  selectionMode: sap.ui.table.SelectionMode.Single,
  visibleRowCountMode: sap.ui.table.VisibleRowCountMode.Fixed,
  editable: true
});

oModel.setData({ rows: tableRows.value, columns: columnArray });
oTable.setModel(oModel);

var counter = 0;
oTable.bindColumns("/columns", function (sId, oContext) {
  var columnName = columnArray[counter];

  var defaultTemplate = new sap.m.Input({
    value: "{" + columnName + "}"
  }).bindProperty("value", columnName, function (cellValue) {
    return returnRange(this, oTable, cellValue, columnName, counter, dic);
  });

  counter++;
  return new sap.ui.table.Column({
    label: columnName,
    template: defaultTemplate,
    flexible: true,
    autoResizable: true,
    width: 'auto',
    multiLabels: [
      new sap.ui.commons.Label({ text: columnName }),
      new sap.ui.commons.Label({ text: dic[Number(counter - 1)].value[0] + " - " + dic[Number(counter - 1)].value[1] })
    ]
  });
});

oTable.bindRows("/rows");

如您所见,我将rowData和columnNames分为两个数组: tableRows和columnArray

returnRange函数检查一些值,仅返回cellValue

我希望输入字段保留更改后的值(这可能是正常的),因此我可以更改几个输入字段,然后可以通过Ajax-Call更新表。

1 个答案:

答案 0 :(得分:1)

问题在于sap.ui.table.Table具有与默认浏览器滚动不同的自定义滚动行为。不会为每条记录创建一行,而是会创建固定数量的行,并在每次滚动后重新绑定这些行。

如果表是可编辑的并且绑定到JSONModel,则通常会创建双向绑定并根据用户输入更新模型值,因此滚动效果很好。但是,由于您为绑定(returnRange)提供了自定义格式器功能,因此不再可能进行双向绑定。这意味着滚动后所有用户输入都会丢失。

如果您删除像这样的格式化程序功能

var defaultTemplate = new sap.m.Input({
    value: "{" + columnName + "}"
});

它将正常工作。

如果要验证用户输入,则应侦听输入的change事件,并使用InputBase#setValue将其设置为其他值。这也将反映您在JSONModel中所做的更改。