Когда MiniMongo
реактивная рукоятка (find()
, observe()
и т.д.) создается в реактивном вычисления, MiniMongo
обнаружит его и прикрепить слушателя к вычислению-х onInvalidate
, что остановит ручку, когда вычисление аннулируется (или остановился).
Это не имеет значения, является ли это делается непосредственно в autorun
обратного вызова или в функции, которая вызывается из обратного вызова его, до тех пор, как это делается синхронно (т.е., в то время как в контексте одного и того же расчета).
Есть одно заметное исключение: нереактивный обратный вызов.
Tracker.nonreactive
обратного вызова вызывается в нереакционноспособном контексте, поэтому current computation установлен в null
и Tracker.active
установлен в false
. В этих условиях MiniMongo
will not attach the aforementioned listener, и наблюдатель изменений не будет остановлен автоматически.
Вы можете остановить его вручную, хотя:
const MyCollection = new Mongo.Collection(null);
const cursor1 = MyCollection.find({foo: 'bar'});
const cursor2 = MyCollection.find({foo: 'baz'});
let observeCallback = {
added(doc) {
console.log('added', doc);
}
};
let handle = Tracker.autorun(function(c) { // c is the computation object
cursor1.observe(observeCallback); // will be automatically stopped
Tracker.nonreactive(function() {
let observer = cursor2.observe(observeCallback);
c.onStop(function() {
observer.stop(); // explicitly stops the observer
})
});
});
MyCollection.insert({foo: 'bar'});
MyCollection.insert({foo: 'baz'});
handle.stop();
Это не только вложенная функция, это 'nonreactive' контекст, поэтому наблюдение в нем не будет автоматически остановлен. – MasterAM