【问题标题】:Rendering a large table in knockout在淘汰赛中渲染一张大桌子
【发布时间】:2015-11-19 22:31:03
【问题描述】:

我试图在淘汰赛中呈现一张桌子。该代码有效,但随着行数和列数的增加,渲染时间变得非常长。罪魁祸首似乎是通知订阅者并实际执行绑定。我想知道是否有一种方法可以以一种不会导致淘汰赛做这么多事件的方式呈现表格。该表实际上没有交互。纯粹是为了显示数据。我希望在不需要引入另一个模板引擎的情况下实现这一点,只需使用带有 data-bind 属性的 Knockout.js 即可,但我已经尝试过,但似乎没有什么令人满意的。我有两个可观察的数组,一个用于标题,一个用于数据。数据数组是一个数组数组,因为我必须单独构建每一行。

<table>
  <thead>
    <tr>
      <!--ko foreach: headers -->
          <th data-bind="{'text': displayName}"></th>
      <!-- /ko -->
    </tr>
  </thead>
  <tbody data-bind="foreach: row">
    <tr class="form_row">
      <!-- ko foreach: question -->
      <!-- ko if: Type === "image" -->
      <td>
        <a data-bind="attr: {'href': $data.Value, 'target': '_blank'}">
          <img class="thumbnail-img" data-bind="  attr: {'src': $data.Value}" />
        </a>
      </td>
      <!-- /ko -->
      <!-- ko if: Type !== "image" -->
          <td data-bind="{'text': Value}"></td>
      <!-- /ko -->
      <!-- /ko -->
    </tr>
  </tbody>
</table>

您可以使用这个 JsFiddle 来运行类似于我的示例的内容。 http://jsfiddle.net/LkqTU/27820/

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    我的Table binding 展示了如何使用 Knockout 快速生成表。基本方法是使用字符串构造表,然后使用innerHTML 一次性将其全部添加到DOM。您可能还可以使用某种基于字符串的模板引擎来执行此操作,如 Knockout template documentation 中所述。

    我已将您的示例转换为使用 table:

    <table data-bind="table: tableBinding($data)"></table>
    

    Javascript:

    vm.tableBinding = function(vm) {
        return {
            columns: vm.headers.length,
            data: vm.row,
            header: function(col) {
                return vm.headers[col].displayName;
            },
            dataItem: function(row, col, data) {
                var item = data[row].question[col],
                    value = ko.utils.escape(item.Value);
                if (item.Type === "image") {
                    return ko.utils.safeString('<a href="' + value + '" target="_blank"><img class="thumbnail-img" src="' + value + '" /></a>');
                } else {
                    return ko.utils.safeString(value);
                }
            }
        };
    };
    

    jsFiddle:http://jsfiddle.net/mbest/b80t0cL8/

    【讨论】:

    • 如果你在你的代码中使用它,我很想知道它给你带来了多大的改进。
    • 如果没有硬指标,我可以告诉你它从使用 data-bind 的大约 10 秒到使用你的绑定的 1013x29 表几乎是瞬时的,我什至不得不在我的dataItems 函数用于协调要显示的数据,因为我的数据格式不正确,并且仍然非常令人印象深刻。稍微重新排列一下我的数据会让它变得更好。
    猜你喜欢
    • 2014-08-14
    • 2013-05-16
    • 2017-04-12
    • 2012-05-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多