检测触发了哪个被动查询

时间:2013-03-15 00:01:45

标签: meteor

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

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

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

是否有一种简单的方法可以查看触发的内容和内容?

谢谢!

2 个答案:

答案 0 :(得分: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);
      };
    });
  }

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

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;
};

答案 1 :(得分:0)

感谢@cmather的想法。

Meteor 1.3已经改编,logRenders

更高级版本
// Log all rendered templates
// If filter is set, only templates in filter will be logged
// @params filter - name or names of template to filter
logRenders = function logRenders (filter) {
  for (name in Object(Template)){
    if (filter && !Array.isArray(filter)) filter = [filter];
    var template = Template[name];
    if (!template) continue;
    if (filter && filter.indexOf(name) == -1){
      // Clear previous logRenders
      if ('oldRender' in template) template.rendered = template.oldRender;
      delete template.oldRender;
      continue;
    }
    var t = function(name, template){
      if (!('oldRender' in template)) template.oldRender = template.rendered;
      var counter = 0;
      template.rendered = function () {
        console.log(name, ++counter, this);
        this.oldRender && this.oldRender.apply(this, arguments);
      };
    }(name, template);
  };
};