I’m working on a website, and I’m trying to run some code once the template is rendered. I have tested it with console.log and it runs it once the template is rendered, but I’m using iron:router and I don’t know how to access this._id.
The routing code is as follows:
Router.route('/play/:_id', {
template: 'example',
data: function(){
var currentItem = this.params._id;
return mydb.findOne({ _id: currentItem });
}
}
I’m trying to use ‘this’ to get information from the database about the page that I’m on. For example, my collection has a field named ‘name’. I’m trying to access it using ‘this.name ’
And here’s the code for the onRendered function:
Template.example.onRendered(function() {
console.log("before");
console.log(this.name);
});
It logs before, but returns null on this.name .
Any help is appreciated greatly
try this.data._id and this.data.name and just this.data
With that, I get the error
TypeError: this.data is null
in the console.
However when I just use console.log(this) (I forgot to add this in my last post) I get
Object { view: Object, data: null, firstNode: <div.infotab.fademein>, lastNode: <div.tools.fademein>, _allSubsReadyDep: Object, _allSubsReady: false, _subscriptionHandles: Object }
written out into the console.
Make sure you are “populating” that template correctly
Sorry, I’m new, what do you mean exactly?
try this
rorofat:
Router.route(’/play/:_id’, {
template: ‘example’,
data: function(){
var currentItem = this.params._id;
console.log( this.params._id)
console.log(mydb.findOne({ _id: currentItem });
return mydb.findOne({ _id: currentItem });
}
}
you should see if those variable are properly set.
in your Template.example.onRendered I’m pretty sure you should use this.data.SOMETHING
Tested it - the variables are properly set, though I’m not sure I should this.data, as I have some template events that occur when a key is pressed, and they can access the database through this.SOMETHING just fine…
in a event
Template.example.events({
"keypress: function(){
console.log(this.SOMETHING); // in here this.SOMETHING is fine
}
});
Template.example.onRendered(function(){
console.log(this.data.SOMETHING); // here is different
});
if the variable is properly set in your router there is something wrong how you call that template… but I don’t see it from here
I see - thanks for all the help
In event callbacks you actually get the event and template in the parameters of the callback
Template.example.events({
'keypress input': function(event, template) {
// code
}
});
as for onRendred, you need to make sure that your subscription is ready when it gets called or data will be empty
Do you have a suggested method of delaying when the template gets called?