1

我正在尝试创建一个 Web 应用程序来处理任意大小的二维矩形表。每个表将是一个文档(存储在一个集合中,并由用户彼此共享)。最终,我想将其扩展到任意数量的维度,但 2D 已经给我带来了麻烦。目前我的数据存储为

{dimensions: [2,3],
data: [2, 3, 5, 7, 11, 13]}

但我认为将 UI 代码编写为数组数组会更容易

[[2, 3, 5],
[7, 11, 13]]

我很容易在其他地方进行这种转换。

我一直在研究一个玩具实现,以在不增加集合和用户帐户的复杂性的情况下将我的头脑围绕在反应部分上。硬编码的 2x3 版本位于https://github.com/scentoni/meteor-grid,双{{#each}}循环版本位于https://github.com/scentoni/meteor-grid/tree/loopcell,其中关键位是

<table>
  <tbody>
    {{#each rows}}
    <tr>
      {{#each cols}}
      <td><input class="cell" name="{{../row}},{{col}}" type="text" value="{{stuff ../row col}}"/></td>
      {{/each}}
    </tr>
    {{/each}}
  </tbody>
</table>

var iota = function (n) {return Array.apply(null, {length: n}).map(Number.call, Number); }

Template.page.rows = function () {
  return iota(Session.get('numrows')).map( function (x) {return {row: x};} );
};

Template.page.cols = function () {
  return iota(Session.get('numcols')).map( function (x) {return {col: x};} );
};

Template.page.stuff = function (i, j) {
  return Session.get('data')[i][j];
};

这似乎有效,但我觉得我在滥用这些工具。谁能给我一些指导?

4

1 回答 1

1

我做了一些类似的(在流星中用于移动的一种电子表格)

关于使用 Sessions 的用途存在一些争论,因为我记得 Meteor 中的代码:在这种情况下使用 Sessions 会由于从/到 JSON 的转换而产生开销

我会推荐:

通过使用 Deps 创建一个用于处理两个暗淡数组的对象来使数组具有反应性,(具有用于:add/del row/col、get/set cell 的接口)文档:http ://docs.meteor.com/#deps_dependency -如果适合项目,您也可以使用集合。

我在当前模板系统中遇到的一个问题是您必须在子模板中拆分内容。您的代码所做的是在反应数据无效时进行完整的重新渲染 - 如果一个单元格更改了整个内容,则重新渲染。尝试将其拆分为:

{{each row}}
  {{>viewRow}}
{{/each}}

<template name="viewRow">
  <tr>
  {{each cell}}
    {{>viewCell}}
  {{/each}}
  </tr>
</template>

...

我在 Meteor 中为调试模板制作了一个片段:https : //gist.github.com/raix/5598923 这将总结模板渲染并提供一些统计信息,它有助于以仅重新渲染更改的数据的方式构建我的模板。

有一天我可能会打包一个电子表格包,

于 2013-06-14T21:56:22.337 回答