2016-01-24 2 views
1

У меня есть несколько диаграмм на приборной панели, где показаны подсчеты, групповые байты и т. Д. Бэкэнд-данные имеют более миллиона строк. Я решил не использовать подписки. Мне не нужны реактивные обновления для диаграмм.Метеор Ожидание данных Перед рендерингом 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 

Я надеюсь, что я объясняю проблему, и мои попытки четко. Есть предположения?

ответ

0

Я считаю, что Template.instance() недоступен в обратных вызовах из методов Meteor самостоятельно. Вместо этого вы можете:

exampleHelper() { 
    var template = Template.instance(); 
    Meteor.call('example', function(error, results) { 
     console.log(Template.instance()); // Undefined 
     console.log(template); // What you want in order to set your reactive variables. 
    }); 
} 

Это позволит вам использовать реактивные вары и правильно настроить состояние в обратных вызовах.

+0

Я делаю свои вызовы инициализации from onCreated. Я передал ссылку шаблона методу, передав «это». Теперь я могу правильно настроить реактивные переменные. Но даже при изменении состояния при извлечении данных диаграмма не отображает. Нужно ли мне перерисовывать диаграмму? – SudiB

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