Метеоритные реактивные вычисления не срабатывают при сборе.обновление()


Я определил коллекцию метеоров, в которой хранятся пути, позволяющие использовать общий холст для рисования:

CanvasPaths = new Meteor.Collection("canvasPaths");

Я перерисовываю холст в блоке автозапуска:

Deps.autorun(function() {
    var paths = CanvasPaths.find().fetch();
    //some stuff happens
}

Добавление путей к коллекции с помощью collection.insert () запускает этот блок автозапуска для повторного запуска, когда вычисление становится недействительным:

CanvasPaths.insert({
    path: collectionPath
});

Однако, когда я обновляю путь уже в коллекции, вычисление не становится недействительным и функция автозапуска не запускается повторно:

CanvasPaths.update(id, {
    $set: {
        path: getPathObjectForCollection(this)
    }
});

Конечно обновление коллекция делает недействительными любые вычисления в реактивных блоках, которые используют эту коллекцию? Как сделать функцию в блоке автозапуска повторной на всех клиентах?

EDIT

В ответ на комментарий Чжунле ли: Я добавил

console.log(CanvasPaths.findOne(id).path); //exisiting record
console.log(getPathObjectForCollection(this)); //what we are updating to

Как раз перед Канваспатами.вызов обновления, это дает результат: Введите описание изображения здесь

Итак, как вы можете видеть, значения positionLeft и positionTop изменились, поэтому, безусловно, следует вызвать блок автозапуска.

1 2

1 ответ:

Оказывается, обновление все-таки запускало автозапуск (как и должно быть).

Код, который я хотел выполнить в автозапуске, не выполнялся из-за оператора if, который содержался в вычислении false по несвязанным причинам.

В будущем лучше всего иметь console.log("auto run executed"); в начале блока автозапуска. Тогда вы мгновенно узнаете, запускается ли автозапуск или нет при любых условиях.