【问题标题】:How can I integrate SlickGrid with Meteor.js reactive collections?如何将 SlickGrid 与 Meteor.js 反应式集合集成?
【发布时间】:2012-05-08 13:15:30
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript meteor slickgrid minimongo


    【解决方案1】:

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

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

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

    该示例最重要的部分在这个 sn-p 中:

      // 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。

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

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

      "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,
    

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

      "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(),
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 2022-07-06
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 2020-09-04
      相关资源
      最近更新 更多