Meteor.js:返回一个光标的非反应快照

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

本文关键字:光标 快照 一个 js 返回 Meteor      更新时间:2023-09-26

我当前正从一个助手返回一个来自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中不会发生变化?我希望它在返回时像非反应性快照一样返回。

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

Meteor中没有一种方法可以快照光标的状态吗?

感谢您的指导!

您有两个可能的选项。

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

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

第二个是禁用发现的反应性

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,它本身是反应性的。然后你调用一个游标,它也是被动的。因此,根据具体情况,你可能会在反应性方面受到其中一个或另一个的打击。