Today I got myself in really odd situation when did it generally happens that data in the database collection is updating but subscriptions are not re running.
Following is the blaze template
<template name="budget">
{{#if Template.subscriptionsReady}}
{{#if haveBudget}}
<div class="budget-wrapper">
{{>budgetTable tableData=tableData}}
</div>
{{else}}
<h2>Sorry either these reports don't have budget or <br /> you haven't generated it yet, after pdc short..</h2>
{{/if}}
{{else}}
Loading data....
{{/if}}
</template>
Below is my javascript code for this template
Template.budget.onCreated(function() {
const tmpl = this;
Session.set('currentYear',null);
Session.set('pdcId',null);
Session.set('decimalSign',null);
Session.set('budgetData',null);
Session.set('aId',null);
tmpl.analysisData = new ReactiveVar(null);
aId = FlowRouter.getParam('aId');
cId = FlowRouter.getParam('cId');
tmpl.autorun(function() {
tmpl.subscribe('pdcFullBaseData', function() {
completePDCObj = PDCFull.findOne({});
pdcFullData = completePDCObj.pdcFullData;
autoSearchData = createAutoSearchData(completePDCObj);
});
tmpl.subscribe('budgetCoreData',function(){
budgetCoreData = BudgetCoreData.findOne({}).general;
});
Meteor.subscribe('pdcDocumentsWithAnalysisId',aId,function() {
pdcDocument = DocumentsStorage.findOne({analysisId : aId, type: 'FULL_PDC'});
pId = pdcDocument._id;
decimalSign = pdcDocument.decimalSign;
Session.set('pdcId',pId);
Session.set('decimalSign',decimalSign);
})
Meteor.subscribe('analysisWithId',aId,function() {
const analysisData = AnalysisStorage.findOne({_id : aId});
if(analysisData.generateBudget) {
tmpl.analysisData.set(analysisData);
}else {
tmpl.analysisData.set(null);
}
Session.set('aId',aId);
Session.set('decimalSign',analysisData.decimalSign);
Session.set('currentYear',analysisData.year);
Session.set('budgetData',analysisData.budgetData);
Session.set('budgetUploadedData',analysisData.budgetUploadedData);
})
})
})
Template.budget.helpers({
tableData : function() {
const analysisData = Template.instance().analysisData.get();
if(analysisData.budgetData) {
budgetTableData = analysisData.budgetData;
Session.set('budgetData',budgetTableData);
console.log(analysisData,budgetTableData)
return {year : analysisData.year , tableBody : budgetTableData}
}
return null;
},
haveBudget: function() {
const budgetData = Template.instance().analysisData.get().budgetData;
return !!budgetData;
}
})
Template.budgetTable.onCreated(function(){
const tmpl = this;
tmpl.budgetTableMode = new ReactiveVar('automatic');
tmpl.autorun(function() {
Meteor.subscribe('pdcDocumentsWithAnalysisId',aId,function() {
pdcDocument = DocumentsStorage.findOne({analysisId : aId, type: 'FULL_PDC'});
pId = pdcDocument._id;
decimalSign = pdcDocument.decimalSign;
Session.set('pdcId',pId);
Session.set('decimalSign',decimalSign);
})
Meteor.subscribe('analysisWithId',aId,function() {
const analysisData = AnalysisStorage.findOne({_id : aId});
Session.set('decimalSign',analysisData.decimalSign);
Session.set('currentYear',analysisData.year);
Session.set('budgetData',analysisData.budgetData);
Session.set('budgetUploadedData',analysisData.budgetUploadedData);
})
})
})
....
Below are my publications in the server/main.js
file.
/* Publish analysis with id */
Meteor.publish('analysisWithId',function(id){
console.log('analysis id',id);
return AnalysisStorage.find({_id : id})
})
/*Publish pdcs with analysis*/
Meteor.publish('pdcDocumentsWithAnalysisId',function(analysisId) {
console.log('analysisId ',analysisId);
return DocumentsStorage.find({analysisId});
})
/* Publish PDCs */
Meteor.publish('pdc_documents', function pdcDocumentsPublication() {
return DocumentsStorage.find({});
});
/* Publish Results */
Meteor.publish('documents_results', function documentsResultPublication() {
return DocumentsResultStorage.find({});
});
/* Publish the pdcFullBaseData */
Meteor.publish('pdcFullBaseData',function() {
return PDCFull.find({});
})
.....
I have events attached to the table which updates the database collection (AnalysisStorage
). I can verify the updated result using robomongo
which shows me updated results. Also if I hit refresh the table gets updated but since the subscriptions should re run the blaze template should automatically update itself.
I am stuck at this from yesterday, not able to wrap my head around it. Any help is greatly appreciated
P.S : Not super sure about it but I have put console in my publications. And can see those publication code never re run until I do page refresh. May they work this way, so not super sure.