Подтвердить что ты не робот

Обнаружение того, какой реактивный запрос был вызван

У меня есть, вероятно, не такая уникальная проблема, как сложное приложение метеорита.

У меня есть несколько действий, которые заставляют части страницы обновляться, которые действительно не нужны. Но у меня возникли проблемы с поиском того, какой find() (или несколько find()) запускается. Я знаю коллекцию, о которой идет речь, просто не найти().

Я мог бы использовать observChanges для каждого поиска, который я использую, но это будет много дополнительного кода.

Есть ли простой способ увидеть, что запускается и чем?

Спасибо!

4b9b3361

Ответ 1

Здесь вы можете найти полезную функцию ведения журнала. Он регистрирует количество обращений к каждому шаблону в консоли. Вы знаете, что если шаблон загружается после загрузки начальной страницы, это связано с изменением источника реактивных данных, который он использует. Либо этот реактивный источник данных мог быть доступен в вспомогательном методе, либо шаблон является элементом списка (т.е. Внутри вспомогательного блока {{#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;
};

Ответ 2

Спасибо @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);
  };
};