javascript - 如何将 SlickGrid 与 Meteor.js 响应式(Reactive)集合集成?

标签 javascript meteor slickgrid minimongo

SlickGrid 专注于显示表格或数组中的数据,这很棒。 Meteor 专注于操作数据,但使用 Minimongo。 SlickGrid 如何与 Minimonogo 集合集成并保持其快速显示和大数据处理能力?

我目前的做法感觉不对,而且有点难看。我有一个单独的 SlickGrid 数组,并编写了一些胶水代码来处理更新事件:

  • 排序:由 Meteor 处理,触发完全刷新(重新设置数据)
  • 添加/更新/删除:确定索引并使其失效
  • 过滤:由 Meteor 处理,触发完全刷新(重新设置数据)

我如何将 Meteor 数据游标直接绑定(bind)到 SlickGrid 并仅使用一些粘合代码处理事件?或者可以使用 Slick.dataview 吗?目标是处理单元级别的更新。

最佳答案

使用 Slick.Dataview 只会复制您的集合的某些功能(排序、过滤、CRUD..),但您应该检查它以了解它如何与 Slick.Grid 交互。

如果您查看 Slick.Grid 代码,您会发现它仅使用了 Dataview 的 3 个函数 .getLength().getItem().getItemMetadata() 以及最后一个不是强制实现的。 所以 Slick.Grid 基本上是只读取“数据”(Dataview) 的“ View ”组件,但“ Controller ”在哪里?

好吧,你要实际实现它,你可以在“SlickGrid Example 4”中找到一个例子。 '.

该示例最重要的部分在这个片段中:

  // wire up model events to drive the grid
  dataView.onRowCountChanged.subscribe(function (e, args) {
    grid.updateRowCount();
    grid.render();
  });

  dataView.onRowsChanged.subscribe(function (e, args) {
    grid.invalidateRows(args.rows);
    grid.render();
  });

这 2 个事件(onRowCountChanged、onRowsChanged)将在您在 Dataview 中添加、删除、更新行并使用这些函数将信息传递给 Grid 时触发。

所以基本的想法是对你的 Mongo.Collection 做同样的事情,据我所知,Mongo.Cursor 有 .observeChanges() 有点类似于 .onRowsChanged

在文档末尾查看源代码中的 SlickGrid API。

要有效地处理您的网格更新,请尝试使用不同的失效方法 .invalidate(All)Row(s)() 以及 .updateRow()。 updateCell() 用于更精确的控制。

这些主要是处理 View 更新的方法:

  "render": render,
  "invalidate": invalidate,
  "invalidateRow": invalidateRow,
  "invalidateRows": invalidateRows,
  "invalidateAllRows": invalidateAllRows,
  "updateCell": updateCell,
  "updateRow": updateRow,
  "getViewport": getVisibleRange,
  "getRenderedRange": getRenderedRange,
  "resizeCanvas": resizeCanvas,
  "updateRowCount": updateRowCount,
  "scrollRowIntoView": scrollRowIntoView,
  "scrollRowToTop": scrollRowToTop,
  "scrollCellIntoView": scrollCellIntoView,
  "getCanvasNode": getCanvasNode,
  "focus": setFocus,

如果您需要用户与您的网格进行交互,请订阅事件并相应地更新您的集合。

  "onScroll": new Slick.Event(),
  "onSort": new Slick.Event(),
  "onHeaderMouseEnter": new Slick.Event(),
  "onHeaderMouseLeave": new Slick.Event(),
  "onHeaderContextMenu": new Slick.Event(),
  "onHeaderClick": new Slick.Event(),
  "onMouseEnter": new Slick.Event(),
  "onMouseLeave": new Slick.Event(),
  "onClick": new Slick.Event(),
  "onDblClick": new Slick.Event(),
  "onContextMenu": new Slick.Event(),
  "onKeyDown": new Slick.Event(),
  "onAddNewRow": new Slick.Event(),
  "onValidationError": new Slick.Event(),
  "onViewportChanged": new Slick.Event(),
  "onColumnsReordered": new Slick.Event(),
  "onColumnsResized": new Slick.Event(),
  "onCellChange": new Slick.Event(),
  "onActiveCellChanged": new Slick.Event(),
  "onActiveCellPositionChanged": new Slick.Event(),
  "onDragInit": new Slick.Event(),
  "onDragStart": new Slick.Event(),
  "onDrag": new Slick.Event(),
  "onDragEnd": new Slick.Event(),
  "onSelectedRowsChanged": new Slick.Event(),

关于javascript - 如何将 SlickGrid 与 Meteor.js 响应式(Reactive)集合集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10356573/

相关文章:

meteor - 如何对 [Object] 数组的每个单独元素使用 {{#autoForm}}?

javascript - 监听模板外部的事件,但仅当模板存在时

javascript - 如何处理 meteor 中的按钮点击事件?

jquery - 从 jquery 数据表切换到 slickgrid

c# - 如何在 SlickGrid 中的特定行上设置行背景颜色

javascript - 从 firebase 获取正确路径时出错

javascript - IOS WebRTC js 黑屏

javascript - 如何获取数组中的对象值...?

javascript - 如何生成视频缩略图并在将鼠标悬停在进度条上时预览它们?

javascript - Slickgrid - 自定义列排序器