Метеоритные реактивные вычисления не срабатывают при сборе.обновление()
Я определил коллекцию метеоров, в которой хранятся пути, позволяющие использовать общий холст для рисования:
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 ответ:
Оказывается, обновление все-таки запускало автозапуск (как и должно быть).
Код, который я хотел выполнить в автозапуске, не выполнялся из-за оператора if, который содержался в вычислении false по несвязанным причинам.
В будущем лучше всего иметь
console.log("auto run executed");
в начале блока автозапуска. Тогда вы мгновенно узнаете, запускается ли автозапуск или нет при любых условиях.