2014-10-12 4 views
3

У меня есть следующие:Как правильно остановить Meteor Tracker.autorun?

Meteor.startup(function() { 
    var computation = Tracker.autorun(function() { 
    var currentChapter; 
    currentChapter = Chapters.findOne({ 
     _id: currentChapterId 
    }); 
    if (currentChapter) { 
     if (currentChapter.title) { 
     $("#input-title").val(currentChapter.title); 
     } else { 
     $("#input-title").val(""); 
     } 
     if (currentChapter.content) { 
     $("#input-content").html(currentChapter.content); 
     } else { 
     $("#input-content").html(""); 
     } 
    } 
    return computation.stop(); 
    }); 
}); 

Прямо сейчас я получаю:

Exception from Tracker afterFlush function: Cannot call method 'stop' of undefined TypeError: Cannot call method 'stop' of undefined

То, что я хочу сделать, это остановить вычисление раз currentChapter верно. Что я делаю не так?

+0

Я использовал бы метод [наблюдения] (http://docs.meteor.com/#observe) на курсоре вместо использования 'Tracker.autorun' в вашем случае. –

+0

@Peppe L-G Почему бы вам вместо этого использовать наблюдение? – alexchenco

+0

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

ответ

4

две вещи:

1 - Ваша функция автозапуска получает дескриптор вычисления переданного ему, так что вы можете остановить его так:

Meteor.startup(function() { 
    var computation = Tracker.autorun(function(thisComp) { 
    var currentChapter; 
    currentChapter = Chapters.findOne({ 
     _id: currentChapterId 
    }); 
    if (currentChapter) { 
     if (currentChapter.title) { 
     $("#input-title").val(currentChapter.title); 
     } else { 
     $("#input-title").val(""); 
     } 
     if (currentChapter.content) { 
     $("#input-content").html(currentChapter.content); 
     } else { 
     $("#input-content").html(""); 
     } 
     thisComp.stop(); 
    } 
    }); 
}); 

2 - В вашем коде, вычисление будет быть остановлен в конце первого запуска независимо - вы должны остановить его в блоке if (currentChapter).

+0

Возвращаемое значение из 'Tracket.aurotun' должно совпадать с вашим параметром' thisComp'. –

+0

Извините, Пеппе L-G, я не понимаю - не могли бы вы объяснить? – richsilv

+0

@ PeppeL-G 'thisComp' происходит от первого параметра' function', я думаю, что Meteor добавил это тоже (а также возвращаемое значение) – Akshat

Смежные вопросы