我在仪表板上有多个图表,显示计数,分组等等。后端数据有超过100万行。我决定不使用订阅。我不需要对图表进行反应式更新。流星在等待数据渲染Blaze模板之前
我的服务器方法正在使用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”分配给模板onRendered中的highcharts配置对象事件。
服务器方法工作正常。客户也正在获取数据。但是在数据回来之前渲染正在发生。所以图表呈现为空。但是如果我点击应用程序并回到此页面,我会看到数据。我不确定是否我明确知道发生了什么,但我猜测数据最终会回来并填充会话变量,并且由于会话粘滞,我会在延迟后看到数据。
我想不渲染,直到数据回来。所以我在Template onCreated中创建了一个ReactiveVar。
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
我希望我解释清楚这个问题,我的尝试。有什么想法吗?
我正在从onCreated进行初始化调用。通过传递'this'来将模板的引用传递给方法。我现在可以适当地设置被动变量。但即使数据检索时状态发生变化,图表也不会呈现。我是否必须触发重绘图表? – SudiB