У меня есть несколько диаграмм на приборной панели, где показаны подсчеты, групповые байты и т. Д. Бэкэнд-данные имеют более миллиона строк. Я решил не использовать подписки. Мне не нужны реактивные обновления для диаграмм.Метеор Ожидание данных Перед рендерингом Blaze Template
Мои методы сервера используют rawCollection, запускают скопления для получения результатов, и я назначаю данные своим объектам диаграммы через переменные сеанса, которые устанавливаю в своих обратных вызовах клиента.
метод сервера:
function purchasedItemDollarsByCategory() {
Future = Npm.require('fibers/future');
var iCat = new Future();
Purchasing.rawCollection().aggregate([
{
$project: {
"GLCodeName": 1,
"Amount" : 1
}
},
{
$group : {
_id: "$GLCodeName",
amount: { $sum : "$Amount" }
}
},
{
$sort :
{_id : 1}
}
],
function(err,docs) {
if (err) {
iCat.throw(err);
} else {
iCat.return(docs);
}
}
);
return iCat.wait();
}
В шаблоне я звоню
function getPurchasedItemDollarsByCategory() {
Meteor.call('purchasedItemDollarsByCategory', function (err, results) {
if (err) {
toastr.error('Something went wrong. Could not retrieve purchased Item count');
return false;
} else {
Session.set('purchasedItemDollarsByCategory', results);
}
})
}
Теперь я использую другую функцию, чтобы сформировать данные для диаграммы:
function getPurchasedItemCountByCategoryChartData() {
var allItemsPurchasedByCategory = Session.get('purchasedItemCountByCategory');
var allGlCodes = [];
var allItemPurchasedCountDataPoints = [];
var contractedPurchasedCountDataPoints = [];
_.forEach(allItemsPurchasedByCategory, function(d) {
allGlCodes.push(d._id);
allItemPurchasedCountDataPoints.push(d.items);
});
Session.set('allGlCodes', allGlCodes);
Session.set('allItemPurchasedCountDataPoints', allItemPurchasedCountDataPoints);
}
Теперь я назначаю «allGlCodes» и «allItemPurchasedCountDataPoints» в объект конфигурации highcharts в Template onRendered мероприятие.
Серверный метод работает нормально. Клиент также получает данные. Но рендеринг происходит до того, как данные вернутся. Таким образом, диаграмма становится пустой. Но если я нажму на приложение и вернусь на эту страницу, я увижу данные. Я не уверен, что я точно понимаю, что происходит, но я предполагаю, что данные в конечном итоге возвращаются и заполняют переменную сеанса, и поскольку сеанс липкий, я вижу данные после задержки.
Я бы хотел, чтобы данные не возвращались, пока данные не вернутся. Поэтому я создал ReactiveVar в Template onCreated.
this.isLoadingA = new ReactiveVar(false);
this.isLoadingB = new ReactiveVar(false);
this.isLoading = new ReactiveVar (this.isLoadingA && this.isLoadingB);
Теперь вопрос заключается в том, где следует установить их в false. У меня несколько вызовов на сервере. Я мог бы иметь isLoading для каждого вызова и создать переменную allDataReady. Но если я пытаюсь установить в моем успехе обратного вызова для метода сервера:
Template.instance().isLoadingA.set(true);
Я получаю следующее сообщение об ошибке:
TypeError: Cannot read property 'isLoadingA' of null
Я надеюсь, что я объясняю проблему, и мои попытки четко. Есть предположения?
Я делаю свои вызовы инициализации from onCreated. Я передал ссылку шаблона методу, передав «это». Теперь я могу правильно настроить реактивные переменные. Но даже при изменении состояния при извлечении данных диаграмма не отображает. Нужно ли мне перерисовывать диаграмму? – SudiB