Meteor.js : return 游标的非反应性快照

Meteor.js : return a non-reactive snapshot of a cursor

我目前正在 return 从助手处获取来自 Meteor.users 的光标。

Javascript 控制器:

Template.rtcCarousel.helpers({
  rtcUsers: function() {
    if (Session.get("rtcSettings"))
    {
      let cursor = Modules.both.query.getRTCUsers(Session.get("rtcSettings"), 20);

      cursor.observe({
        added: ( item ) => {
          if (Session.get('viewMode') == 1)
          {
            // my css animation stuff here
          }
        }
      });

      return cursor;
    }
  }
});

HTML 视图:

<template name="rtcCarousel">
  {{#each $mapped rtcUsers}}
    <div>
      {{> rtcucard}}
    </div>
  {{/each}}
</template>

关键是我的视图可以在两种模式之间切换:我希望光标在模式 1 时更改以触发一些 cs 动画,而在模式 2 时什么都不做。我的意思是:我什至不想如果由于 #each 接收我的助手而添加或删除文档,将重新呈现视图。

我该如何处理?如何确保我的光标不会在模式 2 中改变?我希望它现在 return 像非反应性快照一样 returns.

我想我需要一些 Session 值来自动重新计算助手,然后我可以做一些棘手的事情,比如获取光标,快照 ID,然后切换 returned 光标一个仅匹配此 _id 文档的新查询,并等待会话切换回正常的反应用例,但这将非常棘手。

Meteor 中没有办法对游标的状态进行快照吗?

感谢指导!

您有两个可能的选择。

第一个是使用Tracker.nonreactive(func)

cursor = Tracker.nonreactive(Modules.both.query.getRTCUsers(Session.get("rtcSettings"), 20))

第二个是禁用reactivity on the find

Modules.both.query.getRTCUsers = function (settings, limit, reactive) {
  return RTCUsers.find({settings: settings}, {limit: limit, reactive: reactive})
}

Modules.both.query.getRTCUsers(Session.get("rtcSettings"), 20, false);

或者可能是两者的组合,具体取决于您的用例。我会说去组合,因为在你的助手中,你有 Session 本身是反应性的。然后你调用一个游标,它也是反应式的。因此,根据上下文,您可能会在反应性方面受到其中之一的打击。