【发布时间】:2017-07-05 06:47:43
【问题描述】:
在我的 html 视图中,我绑定了一个带有淘汰视图模型的 html 表,其中包含 3 个 observableArrays,如下所示:
function myViewModel() {
var self = this;
self.RowIds = ko.observableArray();
self.ColIds = ko.observableArray();
self.allCellsList = ko.observableArray();
self.calculateText = function (r_id, c_id) {
console.log('calculateText');
var item = ko.utils.arrayFirst(self.allCellsList(), function (i) {
return i.rowId() == r_id && i.colId() == c_id;
});
return item.text();
}
self.loadData = function (rowIds, colIds, allCellsList) {
//remove old data (not necessary, only for testing , to see how long it takes)
self.allCellsList.removeAll();
//populate new data:
self.RowIds(ko.mapping.fromJS(rowIds));
self.ColIds(ko.mapping.fromJS(colIds));
self.allCellsList(ko.mapping.fromJS(allCellsList));
}
}
RowIds 包含表中每一行的 id 列表,CoIds 包含表中每一列的 id 列表。 allCellsList 是保存对象列表的主表,其中每个对象都包含两个标识符:rowId 和 colId。 在 table 的每个单元格中调用函数 calculateText ,并通过这两个字段计算 allCellsList 中的匹配数据。 如下:
<table>
<tbody data-bind="foreach:RowIds">
<tr data-bind="foreach:$root.ColIds()">
<td>
<div data-bind="text:$root.calculateText($data , $parent)">
</div>
</td>
</tr>
</tbody>
</table>
当我在 loadData 函数中使用新数据初始化 allCellsList 时,通过删除旧数据并获取新数据(或通过直接获取新数据,不使用 removeAll 函数) - 调用 calculateText 函数,对于每个项目在旧列表中,以及对于新列表中的每个项目。 如果旧列表包含大量记录 - 清除数组操作需要太长时间。 (有时 3-4 秒)
我的问题是如何在这种情况下或在其他情况下填充 allCellsList,以便重新加载操作更快? 当 allCellsList 被清除时,有没有办法避免调用函数 calculateText ?
谢谢。
【问题讨论】:
-
大型表本身就是 Knockout 中的性能问题。请参阅knockout-table,了解在 Knockout 中呈现表格的更好表现方式。
标签: javascript html knockout.js