iron-routermeteor-blaze

Meteor Blaze Templates Data Context in onCreated


I am reading in several places that I should be able to get the data context of the current template with Template.currentData();

I found that it seems to only work within an autorun. But after logging the data as a variable there, first it logs null, then it logs the data in the console.

When I try to use the data, like for example trying to pass data._id into a subscription, I get a TypeError in the console. TypeError: Cannot read property '_id' of null. So for some reason, the data is null and I am struggling to find out why.

I have the data context set within my routes using Iron Router:

Router.route('/stock/:stockNumber', {
   name: 'stock.detail',
   template: 'StockDetail',
   data: function () {
      return Stock.findOne({
         stockNumber: this.params.stockNumber*1
      });
   }
});

What I am trying to do is get access to the data context so that I can pass some things from it, such as the '_id' into some other subscriptions. What am I doing wrong?

The template is otherwise correctly displaying the data on the page as expected, and I can use Spacebars to show things like {{_id}} for example. But again, I seem to be unable to get access to the data context in Template.StockDetail.onCreated


Solution

  • Ok, so here's what I ended up doing...

    Apparently the data context is just simply not available in the onCreated, period. What I had to do was do a Collection.findOne() within the autorun to find the stockItem and set the result to a variable, then use the stockItem._id as the parameter in the new subscription IF the item was found. With both of these things, it seems to work just fine.

    Template.StockDetail.onCreated(function () {
       let instance = this;
    
       instance.autorun(function () {
          instance.subscribe('stock_item', Router.current().params.stockNumber);
    
          let stockItem = Stock.findOne({ // This is what was needed for some reason...
             stockNumber: Router.current().params.stockNumber*1
          });
    
          if (stockItem) { // ...and, also, this was needed
             instance.subscribe('stock_item_scan_log', stockItem._id);
          }
    
       });
    });
    

    I just don't understand why I can't just easily get the _id some other way. This way just feels incorrect and I don't like it.