2014-11-14 27 views
2

Я использую метеорит, железо-роутер и d3. d3 используется для интерактивного отображения круговой диаграммы на основе данных, которые я вычисляю в функции данных железного маршрутизатора. Итак, я хочу, чтобы d3 запускался, когда dom находится на своем месте.Метеор, где поставить код d3?

Однако, я не знаю, где я должен поставить код d3. Я использовал, чтобы поместить это в функцию данных, которую я генерирую данные. Однако иногда функция данных вычисляется, пока dom не готов (поэтому d3 не может нарисовать диаграмму).

Я хотел бы запустить d3 после полного отображения dom, и функция может получить доступ к результату функции данных. Я попытался использовать hooks onAfterAction, но, похоже, эта функция не может получить доступ к данным. Я также попытался использовать Template..rendered, как говорят некоторые другие сообщения в stackoverflow. Однако отображаемая функция работает только один раз, и она не перезапускается при изменении данных. Я помещал функцию rendered в функцию Tracker.autorun, но она по-прежнему запускается только один раз.

Итак, есть ли место для запуска кода d3, который может получить доступ к предоставленному dom, а также к полю данных?

Спасибо.

ответ

5

Вы должны использовать обратный вызов onRendered с помощью template autorun. Из коробки, что не работает с 1.0, однако есть хитрость - вы можете получить автозапуск перезапускать после изменения контекста с помощью Template.currentData так:

Template.myPictures.onRendered(function() { 
    this.autorun(function() { 
    var data = Template.currentData(); 
    // use data with d3 here 
    }); 
}); 

Для получения более подробной информации см конца this issue ,

+0

Хороший трюк, я сталь, который =) – Guidouil

+0

Отлично, он работает! – Fei

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