检测触发了哪个被动查询

Ric*_*het 13 meteor

我有一个可能不是那么独特的问题,有一个复杂的流星应用程序.

我有几个操作导致页面部分刷新,实际上不需要.但我无法找到哪个find()(或多个find())是被触发的那个.我知道有问题的收藏,而不是找到().

我可以在我使用的每个查找中使用observeChanges,但这将是很多额外的代码.

有没有一种简单的方法可以看到触发的内容和内容?

谢谢!

cma*_*her 19

这是一个您可能会觉得有用的渲染记录功能.它记录每个模板呈现给控制台的次数.您知道在初始页面加载后是否重新呈现模板,这是因为它所依赖的被动数据源已经发生了变化.可以使用辅助方法访问此活动数据源,或者模板是列表项(即{{#each ...}}块帮助程序内),并添加/移动/删除/更改列表项.还要记住,子项模板在渲染或重新渲染子项时调用其父项的渲染回调.所以,这可能会让你误以为父母实际上已经脱掉了DOM并放回去,但事实并非如此.

因此,您可以在客户端代码的末尾调用此函数来查看渲染计数:

  function logRenders () {
    _.each(Template, function (template, name) {
      var oldRender = template.rendered;
      var counter = 0;

      template.rendered = function () {
        console.log(name, "render count: ", ++counter);
        oldRender && oldRender.apply(this, arguments);
      };
    });
  }
Run Code Online (Sandbox Code Playgroud)

编辑:这是一种包装查找光标以将光标的所有更改记录到控制台的方法.我刚刚为此编写了一个类似的函数,用于我正在研究的一个叫做反应视觉的新软件包.希望很快就会发布.

var wrappedFind = Meteor.Collection.prototype.find;

Meteor.Collection.prototype.find = function () {
  var cursor = wrappedFind.apply(this, arguments);
  var collectionName = this._name;

  cursor.observeChanges({
    added: function (id, fields) {
      console.log(collectionName, 'added', id, fields);
    },

    changed: function (id, fields) {
      console.log(collectionName, 'changed', id, fields);
    },

    movedBefore: function (id, before) {
      console.log(collectionName, 'movedBefore', id, before);
    },

    removed: function (id) {
      console.log(collectionName, 'removed', id);
    }
  });

  return cursor;
};
Run Code Online (Sandbox Code Playgroud)