Как узнать, не изменилась ли подписка на Meteor Collection.[Метеор + Пламя] - PullRequest
0 голосов
/ 24 апреля 2018

Ниже приведен фрагмент подписки в пользовательском интерфейсе.

Template.AssociateEmp.onCreated(function(){
    this.validEmail = new ReactiveVar('');

    const tpl = this;
    this.autorun(() => {
        var email = this.validEmail.get();
        this.subscribe('GetUnassociatedUser', email, {
            onReady: function () {},
            onError: function () {}
          });
    });
});

Есть ли способ узнать, что даже если динамические данные изменились (здесь validEmail), подписка Meteor не была затронута и не изменила свои данные в пользовательском интерфейсе? Есть ли какой-либо флаг или что-то, что срабатывает, когда данные подписки не изменяются?

1 Ответ

0 голосов
/ 24 апреля 2018

Автозапуск, ReactiveVar и Подписки

В вашем примере кода сама подписка перезапустит функцию публикации сервера, поскольку входная переменная подписки email зависит от реактивной переменной validEmail и, таким образом, вызывает autorun при изменении validEmail.

Вы можете легко проверить это на консоли сервера, зарегистрировав что-то на консоли в публикации.

Если validEmail остается неизменным, то нет причины для запуска autorun (если нет других реактивных источников, которые не могут быть добавлены в ваш пример кода).


А как насчет подписанных данных

Теперь, если что-то привело к повторному запуску подписки, и вы хотите знать, изменились ли данные коллекции, вы можете легко проверить collection.count(), но это может быть ошибочным.

Представьте, что ваша публикация параметризована так, чтобы включать разные поля по разным параметрам, тогда данные, передаваемые в коллекцию на стороне клиента, будут другими.

Затем вам потребуется метод проверки целостности данных на стороне клиента.


Использование хэшей для проверки целостности

Возможная помощь будет заключаться в том, чтобы генерировать hases из набора данных, используя пакет sha.

Например, вы можете создать один хеш всей вашей коллекции:

// get data
const data = Collection.find().fetch();

// map data to strings
// and reduce to one string
const hashInput = data.map(doc => JSON.stringify(doc) ).reduce((a, b) => a + b);

// generate hash
const collectionHash = SHA256(hashInput);

После следующего onReady вы можете сгенерировать новый хэш коллекции и сравнить его с предыдущим хешем. Если они разные, значит что-то изменилось.

Это также устраняет необходимость в итерации документов коллекции, если вы хотите знать только, изменились ли данные, но не показывает, какой документ изменился.


Хеширование отдельных документов

Хеширование отдельных документов дает вам более полное представление о том, что изменилось. Для этого вам нужно всего лишь создать карту хешей вашей коллекции:

// get data
const data = Collection.find().fetch();

// map data to strings
const hashes = data.map(doc => { _id: doc._id, hash: SHA256( JSON.stringify(doc) ) });

Вы можете хранить эти хеши вместе с _id документа. Если после новой подписки хеш документа отличается, вы можете предположить, что изменение связано с этим документом.

Общие примечания

  • хэширование - это какая-то дорогостоящая операция, поэтому может быть сложно поддерживать производительность больших коллекций
  • обычно вы должны проектировать ваш паб / саб и автозапуск таким образом, чтобы при изменении ввода вывод изменялся
  • код написан холодным шрифтом, поэтому он может не работать из коробки. Пожалуйста, дайте мне знать, если что-то не так.
...