1

我正在使用 YUI 3.7.3,并且有一个 DataTable 的实例。表中的行由“Session”对象表示,表列中显示的值来自每个 Session 对象的内部列表(即,我为每列指定“格式化程序”。)当新数据添加到内部列表(基本上是更新的会话状态),我希望能够告诉 DataTable 该行需要标记为脏/重新显示。但是怎么做?DataTable.modifyRow() 似乎没有这样做,因为我实际上并没有修改 Session 对象的直接属性——我正在将数据添加到 Session 的子列表中。

告诉 DataTable 需要重新显示特定行的推荐方法是什么?

4

1 回答 1

0

似乎没有一种直接的方法来指示单行的记录需要重新呈现。您可以尝试在相关模型上模拟更改事件。

var table = new Y.DataTable({
  columns: [
    { key: 'obj', label: 'nested', formatter: function (o) { return o.value.nested; } }
  ],
  data: [ {obj: {nested: 42}} ]
}).render('#table'), row = table.getRecord(0), data = row.get('obj');

data.nested = 47;
row.fire('change', { changed: { prevVal: data, newVal: data } });

根据您想模仿Model:change事件的程度,您可能希望在更改数据之前执行数据的深层复制,然后将其作为 prevVal 传递。出于更新 DataTable 视图的目的,这似乎无关紧要,因为您也可以这样做:

row.fire('change');

结果是一样的。这是脆弱的,并且可能不是该界面的预期使用方式。但是,如果您需要完成的只是在更改内部状态后更新视图,而不是触发任何与更改相关的事件,那么DataTable.syncUI是一个更优雅的解决方案。

var table = new Y.DataTable({
  columns: [
    { key: 'obj', label: 'nested', formatter: function (o) { return o.value.nested; } }
  ],
  data: [ {obj: {nested: 42}} ]
}).render('#table'), row = table.getRecord(0), data = row.get('obj');

data.nested = 47;
table.syncUI();

有了这个,您可以执行所有数据操作,然后syncUI在您想要重绘时调用,而不是为修改的每一行触发。希望这可以帮助。

于 2012-12-30T04:15:39.100 回答