是否可以强制仅更新一个td(单元格)进行查看?
有一种方法require 'open-uri'
content = URI(your_url).read
,但它会重新渲染所有单元格。
我想使用ajax更新表内容JSON数据(hot.render()
),但我无法找到如何强制渲染表。每次收到数据时,我的表都非常庞大。
如,
hot.getData()
是否可以在$.ajax(url,... ,success: function(d){
var data = hot.getData();
data[parseInt(d['row'],10)][d['col']] = d['value'];
hot.render();//please, change this function into more simple.
},
...
);
?
答案 0 :(得分:4)
我同意完整的网格渲染是好的,但是有一个缺点。当我们渲染完整的网格时,它将滚动回到第1行,它不会存储我们在render.E.g之前的最后一个视图。一旦我渲染网格将返回第1行,我就在第100行,现在用户必须再次滚动回第100行,这是令人沮丧的。
此问题的任何解决方案。
我发现我们可以使用hot.selectCell(100,1)返回第100行,但是如何以编程方式存储我们在行号100中,以便我可以将其设置回该行。 / p>
我做了一个customRendering来使用下面的代码更改Grid的值,但是当我们要更改大量行时它会有一些性能问题。
//Below code will render one row ,similarly apply the loop to modify multiple row.
data.Records[i].Values.forEach(function(value, ix) {
hot.setDataAtCell(i, ix, value);
//i is row number , ix is the column number , v is the new value.
}
然而hot.setDataAtCell(i,ix,v)成本很高,所以如果你有大量的行,那么它会达到性能。但是好处是它会做自定义(单/多个)单元格/行渲染而不滚动网格并保留用户视图。
P.S。代替hot.setDataAtCell,您可以使用setDataAtRowProp来设置行的值,但是我没有尝试过。
答案 1 :(得分:3)
重新渲染整个表是Handsontable允许你渲染的唯一方法,并且它有一些很好的理由。首先,由于正在使用虚拟渲染,因此表格的大小并不重要。这意味着它只会呈现您可以看到的内容以及更多行。即使您拥有数万亿行和列,它仍然只能渲染到足以让您认为它已完全渲染。假设您没有使用自定义渲染器做一些时髦的事情,这不是一项繁重的任务。
它从头开始呈现所有内容的另一个原因是它是保持无状态DOM对象的Handsontable方式。如果您开始手动渲染特定单元格,那么最终可能会出现一个不同步的查找表。而且,由于虚拟渲染限制了渲染的内容,因此没有与完全重新渲染相关的性能问题。
答案 2 :(得分:0)
您可以使用setDataAtCell()
方法来更新一个或多个单元格。
setDataAtCell(行,列,值,源)
为单元格设置新值。要一次更改多个单元格(建议的方式),请将格式为
[[row, col, value], ...]
的更改数组作为第一个参数传递。来源: https://handsontable.com/docs/7.2.2/Core.html#setDataAtCell
例如:
var row = 3;
var col = 7;
var value = "Content of cell 3,7";
hot.setDataAtCell(row, col, value); // Update a single cell
Method还接受一个值数组来一次更新多个单元格。例如:
var cell_3_7 = [3, 7, "Content of cell 3,7"];
var cell_5_2 = [5, 2, "Content of cell 5,2"];
hot.setDataAtCell([ cell_3_7, cell_5_2 ]); // Update a multiple cells
请注意,Handsontable文档不建议手动重新渲染整个表格。
render()
不推荐,手动调用此方法。 Handsontable尝试通过选择生命周期中的最佳时刻来呈现自己。