2015-08-19 2 views
0

Когда я объявляю подписку автозапуска в функции Template.onCreated, автозапуск был запущен дважды, поэтому публикация запускается дважды.Метеор: почему автозапуск выполняется дважды в onCreated

Route.route 'moneyDepositRequest', 
    onRun: -> 
    console.log 'onRun' 
    Session.set 'condition', where: name: 'example' 

Template.moneyDepositRequest.onCreated -> 
    console.log 'onCreated' 
    @autorun -> 
    console.log 'autorun' 
    @subscribe 'data', Session.get('condition') 

if Meteor.isServer 
    Meteor.publish 'data', (condition) -> 
    console.log 'data publication' 
    Data.find() 

Этот код показывает эту последовательность журналов.
'публикация данных'
'OnRun'
'onCreated'
'автозапуск'
'публикация данных'

Я не понимаю, почему 'публикация данных' обжигают заранее before onCreated выполнен.

Если я объявил это действие автозапуска в функции onRenderd, проблема будет решена.

Как я мог понять это?

ответ

1

Tracker.autorun всегда выполняет код сразу же, а затем позже, когда любые реактивные переменные или функции внутри него меняются. Таким образом, он запускается сразу же, а затем сразу же, когда маршрут запускается. Попробуйте это вместо:

Template.moneyDepositRequest.onCreated -> 
    console.log 'onCreated' 
    @autorun => 
    console.log 'autorun' 

    if !!Session.get('condition') 
     @subscribe 'data', Session.get('condition') 

BTW, как примечание, я начинаю отходить от CoffeeScript. ES6 будет медленно быстро станет новым стандартом, а у CoffeeScript нет дорожной карты для трансмиляции ES6.

+0

Спасибо за ясный ответ. – jwjin

+0

Кроме того !! Если CoffeeScript не входят ES6, означает ли это, что мы больше не можем использовать CoffeeScript на ES6? Я думаю, что если компилятор CoffeeScript обновлен или использует какой-либо pollyfill для его использования, мы можем использовать его правильно? ? ВПЕРВЫЕ, я люблю кофе. – jwjin

+0

Продолжайте использовать CoffeeScript. :) Просто знайте, что может быть пара нишевых вещей, которые вы не сможете сделать, что вы можете сделать в ES6. Что касается '!! Session', использование' !! 'просто в основном превращает истинный элемент в правильное логическое' true'. Вы также можете просто выполнить 'if Session.get ('condition') 'там, это тоже должно работать нормально. – ffxsam

0

Наконец-то я нашел свою огромную ошибку. Я установил условие Session.set 'на другом маршруте, используя тот же шаблон, так что Reactive был уволен этим новым условием сеанса перед перемещением маршрута.

И еще одна вещь. Если вы используете IronRouter и используете шаблон для нескольких маршрутов, вам нужно объявить шаблон: «templateName» для каждой карты маршрута.

Например, предположим, что у нас есть три маршрутизатора, использующих один и тот же шаблон.

Router.route 'first' 
Router.route 'second', 
    template: 'sharedTemplate' 
Router.route 'third', 
    template: 'sharedTemplate' 

В этом случае, первый маршрут будет срабатывать с крючками шаблонных onCreated так автозапуск и подписка будут уволены снова. (для других шаблонов экраны изменяются для изменения данных только по реактивной подписке.

Так что, если мы объявим шаблон: 'sharedTemplate' на первом маршруте, будет работать так, как мы ожидали. (изменено только когда данные маршрут был изменен).

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

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